1. 객체는 특성(state) 와 행동을 가진다. 그리고 다른 객체들과 상호작용을 한다.

  2. 객체 지향의 특성 중 하나는 캡슐화이다. 이는 곧 복잡한 내부를 캡슐로 싸서 내부를 볼 수 없게 하는 것이다. 이를 통해 외부 접근으로부터 내부 객체를 보호하는 효과까지 일석이조로 누릴 수 있다.

  3. 클래스 ↔ 객체

    1. 클래스란 객체 모양을 선언한 틀!! 붕어빵틀.
      1. 메소드와 필드는 모두!! 클래스 안에 구현되어야 한다.
    2. 객체란 클래스의 모양대로 생성된 실체!
      1. 클래스에서 접근 지정자를 무엇으로 설정했느냐에 따라 객체 내부의 데이터를 외부 접근으로부터 보호할 수 있음.
      2. 객체들은 클래스에 선언된 동일한 속성을 가지지만 속성값은 다를 수 있음!
  4. 객체 지향의 특성

    1. 상속

      1. 부모의 속성이 자식에게 그대로 100% 물려진다는 특성.
      2. is - a 관계가 성립하는지 확인해 봄으로써 상속 관계인지 아닌지 확인 가능
      3. 주의할 것은 부모가 자식의 특성을 다 가지느냐는 보장할 수 없다는 것. 자식에서 부모에게 상속 받은 것 외에 다른 기능을 추가하거나 부모에게서 받은 메소드를 변형할 수도 있기 때문에.
      4. 중요!! 클래스는 다중 상속이 안된다. 즉 부모가 둘 이상일 수 없고, 오로지 하나의 부모만 가질 수 있다. 이는 자바의 인터페이스와 다른 점이다.
    2. 다형성

      1. 같은 이름의 메소드가!! 클래스나 객체 따라 다르게 동작하도록 구현하는 것.

      2. 다형성의 예시로는,

        1. 오버로딩 = 식별자 메소드처럼 함수명은 같은데, 매개 변수 개수나 타입이 달라서 구별되는, 즉 이름은 같지만 다르게 동작하는 메소드
        2. 오버라이딩 = 하나의 부모 클래스에서 파생된 여러 자식 클래스들이 부모로부터 받은 함수를 각자 다르게 구현하는 것 .

        이 있다.

    3. 절차 지향과의 비교

      1. 절차 지향은 작업 순서를 기준으로 표현.
      2. 객체 지향은 상호작용을 중심으로 표현.
    4. 클래스의 구성

    Untitled

    클래스는 접근 권한자, 클래스 선언 명령어와 클래스 이름 이렇게 세 가지를 통해 선언이 되고,

    클래스 구성은 크게 변수를 뜻하는 필드 부분과, 함수를 뜻하는 메소드 부분으로 나눌 수 있다.

    Untitled

    1. 생성자는, 클래스의 이름과 같은 이름을 가진 특별한 메소드를 칭한다. 객체가 생성될 때 컴파일러에 의하여 자동적으로 무조건 한 번이상 호출된다는 것이 특징이다. 개발자는 이를 이용하여 객체를 초기화하는데 필요한 코드를 작성할 수 있다.

    Untitled

    객체는 생성될 때 new 키워드를 통해서만 생성될 수 있다. 객체가 생성이 될 때는 1. 먼저 객체를 담을 레퍼런스 변수가 선언되어야 하고, 2. 객체를 new 라는 키워드를 통해 생성한 다음, (이때 메모리에는 클래스의 타입 크기에 따른 메모리가 할당된다. 또 자동으로 생성자 코드가 실행된다.)

    Untitled

    주의할 점은, 레퍼런스 변수를 선언할 때는 클래스가 메모리에 할당되지 않고 있다가, new 라는 생성자를 사용했을 때에만 메모리에 할당된다는 점이다.

    1. 생성자를 통해 객체가 메모리에 할당된 뒤에는, 객체 멤버 접근자를 이용해서 객체 멤버에 접근이 가능하다.
    2. 아까 위에서, 생성자는 자동으로 컴파일러가 객체 생성과 동시에 호출한다고 햇다. 따라서 기본 생성자를 쓰기를 희망하는 경우, 이를 굳이 클래스의 메소드 영역에 쓸 필요는 없다. 단, 만약 이미 사용자가 기본 생성자가 아닌 다른 생성자를 입력해 놓은 상태라면, 컴파일러가 기본 생성자를 불러오지는 않는다.
    3. 생성자의 특징
      1. 생성자는 초기화를 위한 함수이다.
      2. 생성자는 리턴 타입이 없다.
      3. 생성자는 오버로딩이 가능하므로, 여러 개를 작성할 수 있다. 단 매개변수의 (개수, 타입, 타입의 순서 )중 하나 이상이 서로 달라야 한다.
      4. 생성자는 new 를 통해 객체를 생성할 때, 객체당 한 번만 호출된다!
    4. this 레퍼런스에는 세 가지 종류가 있다.
      1. this 용법 ? 잘 모르겠는..

      2. this. 멤버 용법

        1. 객체의 멤버 변수와 메소드의 매개변수 이름이 서로 같은 경우, 무엇을 뜻하는지 명확히 하기 위해 사용한다.

        Untitled

      3. this() 용법

        1. 생성자 안에서만 사용이 가능한 코드로, 생성자의 제일 처음에 수행되어야 한다. 이는 클래스 내의 다른 생성자를 생성자 안에서 호출하고 싶을 때 사용한다.

        Untitled

        1. 객체의 치환 → 객체의 경우, 객체 자체가 복사되는 것이 아니라 레퍼런스 즉 주소가 복사되기 때문에, 복사된 값을 변경할 경우 객체 자체가 변경된다. 조심!!
        2. 객체 배열

        Untitled

        객체 배열의 경우, 클래스 이름을 먼저 써 주고, 그 클래스를 담을 배열명을 배열을 나타내는 []와 함께 써줌으로써 선언할 수 있다. 그리고 해당 레퍼런스 변수에 new 생성자를 이용하여, 몇 개의 객체를 담을 것인지를 정하고 생성해 주면 된다.

        1. 참고로, 같은 자바 프로젝트 안에 같은 클래스 이름이 있는 경우, 에러가 날 수 있으므로, 새로운 자바 프로젝트를 만들어야 한다.
        2. 메소드의 경우 반드시! 클래스 안에 있어야 한다. 캡슐화 원칙에 따라. 메소드는 접근 지정자와 리턴 타입으로 구성되어 있다.

        Untitled

        1. 자바의 인자 전달 방식에는 두 가지가 있음.

          1. call by value
            1. 값 자체를 전달
          2. call by reference
            1. 메모리 주소를 전달
            2. 배열의 경우도 레퍼런스 전달임. 배열 명이 첫 번째 주소.
        2. 메소드 오버로딩

          1. 메소드 오버롣ㅇ은 매개 변수의 개수나 타입 또는 타입의 순서가 서로 달라야 함.
          2. 근본적으로는 같은 일을 한다. 매개변수만 다른 것이니
        3. 객체 소멸

          1. new 로 할당된 메모리를 자바 가상 기계로 다시 돌려주는 행위.
          2. 자바 가상 기계의 가비지 컬렉터가 주기적으로 쓰레기값을 가져간다. jvm
          3. 가비지는 예를 들어, 자신을 가리키던 레퍼런스 변수가 다른 것을 가리킴으로써 자신을 가리켜 줄 수 있는 변수가 없을 때 생긴다.

          Untitled

          1. 개발자가 System.gc() 를 이용해 가비지 컬렉션을 자동 요청할 수도 있지만, jvm 에게 결정권이 있다.
          2. 자바의 패키지란, 서로 관련성 있는 클래스들끼리 모아둔 디렉터리이다.
          3. 접근 지정자

          Untitled

          자바의 접근 지정자는 4가지가 있다. private < default < protected < public

          private 은 자기 클래스 내에서만 쓸 수 있는.. 외부로 부터 완벽히 차단시키는 것이고

          default 는 동일 패키지 내에서

          protected 는 동일 패키지 + 자식 클래스 허용

          public 은 완전 오픈이다.

          1. 클래스의 접근 지정자는 두 개이다.
            1. default ← 같은 패키지의 클래스에서만 접근 가능. (생략함 주로. )
            2. public ← 모든 클래스에서 허용 가능
          2. 멤버 접근 지정은 위 4가지이다. (변수)