본문 바로가기

study/java

자바/JAVA 객체지향 관련 정리

  • 클래스는 라이브러리(API) 또는 실행 클래스(main())로 사용된다.
  • this() - 동일 클래스의 생성자를 호출할 수 있다. 생성자 오버로딩 할 때 사용하고, 첫줄에 작성해야 한다.
  • 메소드 작성 시, 매개변수의 개수를 모른다면
    • 배열 타입으로 선언하거나 - int sum1(int[] values)
    • 값의 목록만 넘긴다. - int sum2(int ... values) <- 호출할 때 값의 목록을 직접 넘긴다. sum2(1,2,3) 이렇게.
    • 두 방법 다 자바는 배열로 입력을 받는 것이다.
  • return문을 통해 메소드를 종료 시킨다.
  • 메소드 오버로딩 - JVM은 매개값의 타입을 보고 메소드를 결정한다.
  • 인스턴스 멤버(필드와 메소드)는 인스턴스가 생성되야 사용 가능하고, 인스턴스 이름으로 접근 가능하다.
  • 정적 멤버(필드와 메소드, static을 붙여 선언)는 메소드 영역에 로딩되고, 객체가 생성되지 않아도 접근 가능하다.
    (클래스 이름으로 접근)
  • 메소드가 인스턴스 멤버, this를 포함하면 인스턴스 메소드로 선언하고, 그렇지 않고 static 필드만 사용하거나 일반 매개변수를 사용하면 정적 메소드로 선언한다.(객체가 없이도 사용가능해야 해서 그렇다.)
변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
지역 변수
(로컬 변수)
함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성되고 함수가 끝나면 소멸
멤버 변수
(인스턴스 변수)
클래스 멤버 변수로 선언 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨.
static 변수
(클래스 변수)
static 키워드를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 메소드 영역 프로그램이 처음 시작할 때 상수화 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨.
  • 만약 정적 메소드로 인스턴스 멤버를 사용하려면, 객체 생성 후, 참조변수로 정적 메소드를 접근하고 인스턴스 멤버를 접근한다. 같은 방법으로 자기 클래스의 객체를 생성해 같은 클래스의 멤버를 사용할 수 있다.
  • 싱글톤 - 전체 프로그램에서 단 하나의 객체만 만드는 코딩 기법(단일객체)
    1. 생성자 앞에 private를 붙인다.(다른 클래스에서 객체를 생성할 수 없도록)
    2. 클래스 내부에서 자신 객체를 생성한다.(private static)
    3. 그 객체를 리턴하는 정적 메소드를 생성한다.(static)
  • 패키지는 물리적으로 파일 시스템의 폴더이다. 클래스를 체계적으로 관리하기 위해 사용한다.
  • import 문을 통해 다른 패키지의 클래스 또는 인터페이스를 가져온다. 따라서 상위 패키지를 import 하더라도 하위 패키지의 클래스를 사용하기 위해선 따로 import 해야 한다.
  • 다른 패키지의 같은 이름의 클래스를 사용하려면, import 할 때 클래스 이름 전체를 작성한다.
  • 접근 제한자의 종류
    • public - 외부에서 자유롭게 사용 가능
    • private - 외부에서 사용 못함. 내부에서만 가능.
    • default - (접근 제한자를 적지 않았을 때) 같은 패키지에 속한 클래스에서 사용 가능.
    • protected - 같은 패키지의 클래스 또는 해당 클래스를 상속 받은 외부 패키지의 클래스에서 접근 가능하다.
  외부 클래스 하위 클래스 동일 패키지 내부 클래스
public O O O O
protected X O O O
default X X O O
private X X X O

 

  • 다른 클래스의 인스턴스를 생성할 수 있더라도 그 인스턴스의 멤버를 사용할 수 있는 것은 아니다.(생성자와 멤버의 접근제한자는 다를 수 있기 때문에)
  • Getter 메소드와 Setter 메소드
    • 외부 접근으로 객체의 무결성이 깨질 수 있어 보통 필드는 private로 선언함.
    • 그래서 간접적으로 (private가 아닌)메소드를 통해 필드에 접근하도록 함.
    • 필드 값을 set 하는 메소드를 Setter 메소드, get 하는 메소드를 Getter 메소드라고 부른다.
    • Setter 메소드에 검증코드를 넣어 값을 전달할 수 있고, Getter 메소드는 필드값을 가공해 전달할 수 있다.
  • 상속 받으면 생성자도 상속 받는다.
  • 상위 클래스의 private 멤버는 상속받을 수 없다.
  • 서로 다른 패키지의 클래스의 상속 관계에서 당연히 defalut 멤버도 상속받을 수 없다.
  • 자식 객체 생성자의 처음 코드는 부모 객체 생성자이다. 따라서 자식 객체를 생성하면 먼저 부모 객체가 생성된다.
  • super();는 부모 클래스의 기본 생성자이다. 기술하지 않아도 컴파일러가 자동으로 호출하지만, 매개변수를 넘기기 위해 명시적으로 기술할 수 있다.
  • 부모 메소드를 재정의 할 때는, 동일한 시그니처를 갖고 접근 제한은 더 강하게 하지 못한다. 또한 새로운 예외를 throws 할 수 없다.
  • 메소드 재정의를 하더라도 super 접근자로 부모 메소드를 호출할 수 있다. ex) super.print();
  • final 클래스는 상속할 수 없는 클래스, final 메소드는 재정의 할 수 없는 메소드.

 

상속을 사용하는 경우

  • IS-A 관계 is a relationship(inheritance)
    • 일반적인(general) 개념과 구체적인(specific) 개념과의 관계
    • 상위 클래스: 일반적인 개념 클래스 - 포유류
    • 하위 클래스: 구체적인 개념 클래스 - 사람, 원숭이, 고래
    • 단순히 코드의 재사용 목적으론 사용하지 않는다.
  • HAS-A 관계 composition
    • 한 클래스가 다른 클래스를 소유한 관계. 코드 재사용의 방법이다.
    • Car가 Engine를 포함한 관계