Java 프로그래밍기초 230222 #8 상속/Object클래스/오버라이딩/Super/패키지/import

김춘복·2023년 2월 21일
0

Java 공부

목록 보기
11/20

객체지향 Part.2

상속

  • 상속 : 기존의 클래스로 새로운 클래스를 작성하는 것.
    두 클래스를 부모와 자식으로 관계를 맺어준다. (is-a관계)

  • extends 로 상속

class Parent{}
class Child extends Parent{}
  • 조건
    자손은 조상의 모든 멤버를 상속받는다.
    단, 생성자와 초기화 블럭은 제외.
    자손의 멤버 개수는 조상보다 적을 수 없다.
    조상의 변경은 자손에게 영향을 끼치지만, 자손의 변경은 조상에게 영향을 미치지 않는다.

  • cf. 포함관계 : 클래스의 멤버로 참조변수를 선언하는 것.
    작은 단위의 클래스를 만들고 이들을 조합해 클래스를 만듬.
    (has-a관계) Car는 Engine을 가지고있다.

class Engine {}
class Door {}
class Car {
    Engine engine = new Engine();
    Door[] doors = new Door[4]; // 자동차 문 4개, Door 클래스 하나로 문 4개 생성
}

단일상속

  • Java에서는 단일상속만을 허용한다. 자식은 하나의 부모만 가진다.
    비중이 높은 클래스만 상속관계로하고 나머지는 포함관계로 풀어낼 수 있다.

  • Diamond Problem : 다중상속이 될 경우 양쪽 부모로부터 겹치는 이름의 메서드가 있으면 어느 쪽 메서드를 실행해야 할지 꼬이는 문제가 발생할 수도 있다.


Object 클래스

  • 모든 클래스의 조상. 모든 클래스는 Object 클래스에 정의된 메서드를 상속받는다.

  • 부모가 없는 클래스는 컴파일러가 자동으로 Object클래스를 상속하게 한다.

  • Object 클래스의 메서드(잘쓰는 것 몇개만)

    boolean equals(Object obj) : 해당 객체가 전달받은 객체와 같은지 여부 반환.
    protected Object clone() : 해당 객체의 복제본 생성해서 반환.
    Class<T> getClass() : 해당 객체의 클래스 타입 반환.
    int hashCode() : 해당 객체의 해시코드값 반환
    String toString() : 해당 객체의 정보를 문자열로 반환


오버라이딩

  • Overriding : 상속받은 조상의 메서드를 자신에게 맞게 변경하는 것.
    선언부는 변경불가. 메서드 내부의 내용만 변경 가능.
    오버라이딩시 @overriding이라고 IntelliJ에 뜨기도 한다.

  • 참고) 선언부 : int add(int x, int y) <<여기가 선언부. {}블럭 안이 구현부

  • 조건

  1. 선언부가 조상클래스의 메서드와 일치해야 한다.
  2. 접근제어자를 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.

Super와 Super()

  • Super : 객체 자신을 가리키는 참조변수. 인스턴스 메서드 내에서만 존재.
    상속받은 조상의 멤버를 가리킴. 조상의 멤버를 자신의 멤버와 구별할 때 사용.

cf. this는 인스턴스 멤버와 지역변수 구별할 때 사용

  • Super() : 조상의 생성자를 호출할 때 사용. 조상의 멤버는 조상의 생성자를 호출해서 초기화.
    사용할때는 무조건 생성자의 첫줄에 사용해야 한다. (아니면 컴파일러가 자동으로 삽입)

  • 참고 사이트


Package와 import

  • 패키지(Package) : 서로 관련된 클래스의 묶음. 하나의 폴더 개념.
    클래스의 실제이름은 패키지명.클래스명

  • 패키지 선언 : 패키지는 소스파일의 첫번째 문장으로 단 한번만 선언
    같은 소스파일의 클래스는 모두 같은 패키지에 속한다.
    패키지 선언이 없으면 default 패키지에 속한다.

  • 클래스패스(classpath) : 클래스파일(.class)의 위치를 알려주는 경로.
    classpath(환경변수)로 관리하며 경로간의 구분자는 ;를 쓴다.
    classpath에 패키지의 루트를 등록해줘야 한다.

  • import : 클래스를 사용할 때 패키지의 이름을 생략할 수 있게 해준다.
    컴파일러에게 클래스가 속한 패키지를 알려준다
    java.lang 패키지(String, Object, System)는 중요한 클래스들이 모여있어 import를 생략 가능.
    선언 방법 : import 패키지명.클래스명; 패키지와 클래스 선언 사이에 존재한다.

  • static import : static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.

import static java.lang.System.out;		//이렇게 선언하면 아래처럼 간단히 사용 가능.
out.println("출력"); 
profile
Backend Dev / Data Engineer

0개의 댓글