본문 바로가기

한권떼기/자바의 정석

[한권떼기] 자바의정석 챕터07. 객체지향프로그래밍 심화개념

728x90
반응형

 

**자바의 정석(남궁성 저)를 읽고 정리한 글입니다.

 

상속이란?

상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것으로, 코드의 재사용성과 유지보수가 쉬워짐

클래스는 상속 관계에 따라서 조상 클래스, 자손 클래스로 나눌 수 있는데,

상속해주는 클래스가 조상클래스, 상속받는 클래스가 자손클래스임

 

이 때 조상클래스의 생성자와 초기화 블럭은 상속되지 않고, 멤버만 자손클래스에게 상속됨

따라서 자손클래스는 부모에게서 물려받은 멤버+자신의 멤버 의 구성으로 클래스를 사용하게 됨

인스턴스 또한 조상 클래스의 멤버+자손 클래스의 멤버인 하나의 인스턴스가 생성됨

private 또는 default여도 자손 클래스에게 상속될까?
상속됩니다. 정확하게 말하면 상속되지만, 자손 클래스에서 접근할 수 없습니다.

 

상속관계 vs 포함관계

상속과 포함은 언뜻 보면 기능이 비슷하지만 그 의미에 따라 적절한 것으로 사용해야 함

ex. 자동차-바퀴의 관계에서 바퀴는 자동차의 부품이므로 포함관계(멤버변수로 바퀴를 넣어줌). 자동차-탈것의 관계는 자동차의 상위 범위가 탈것이므로 상속관계가 적절함

 

단일상속

자바는 둘 이상의 클래스로부터 상속을 받을 수 없게 하는 단일 상속을 사용함

 

Object 클래스

모든 클래스의 상속 관계에 따라 조상 클래스를 쭉 따라가면 나오는 최상위 조상클래스

명시하지 않아도, 컴파일러가 자동적으로 extends Object를 추가하여 Object 클래스를 상속받도록 함

toString(), equals()와 같이 모든 인스턴스의 기본적인 메소드들이 바로 Object 클래스에 정의되어 있음

 

 

오버라이딩

조상 클래스로부터 상속받은 메소드의 내용을 자손 클래스가 새로 작성하여 고쳐 쓰는 것

따라서 메소드의 이름, 매개변수, 반환 타입이 같아야 함

 

오버라이딩의 규칙

1. 접근 제어자는 조상 클래스의 메소드보다 더 좁은 범위일 수 없음

2. 조상 클래스의 메소드보다 더 범위가 넓고, 많은 수의 예외를 선언할 수 없음

3. +) 조상 클래스에 있는 static 메소드와 자손 클래스에 있는 static 메소드는 이름과 꼴이 같더라도 서로 다른 메소드 (오버라이딩이 아님)

오버라이딩 vs 오버로딩
오버라이딩: 조상클래스로부터 상속받은 메소드를 고쳐 쓰는 것
오버로딩: 같은 이름의 메소드를 반환 형태와 매개변수를 다르게 하여 다른 메소드를 만드는 것

 

super와 super()

super

super은 조상 클래스에게서 상속받은 멤버를 참조하기 위해서 사용하는 변수 (ex.super.parentTemp, 같은 변수명이 있으면 자손클래스의 변수 this.x, 조상의 변수는 super.x 로 접근)

super()

super()은 조상 클래스의 생성자를 의미

Object 클래스를 제외한 모든 클래스는 생성자 첫 줄에 생성자.this()나 super()를 호출 해야 함

만약에 생략되어있다면 컴파일러가 자동으로 super()을 넣어줌

 

 

제어자

접근제어자: public, proteceted, dafault, private

제어자 같은 클래스 같은 패키지 자손클래스 전체
public O O O O
protected O O O  
(default) O O    
private O      

 

 

다형성(Polymorphism)

다형성은 여러가지 형태를 가질 수 있는 능력으로, 자바에서는 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조함으로써 가능

위의 그림처럼, 조상타입의 참조변수로 자손타입의 인스턴스를 참조하는 것은 가능하지만 그 반대는 안됨.

 

추상클래스(abstract class)

추상 메소드를 포함하고 있는 클래스는 추상 클래스임

추상클래스는 인스턴스를 생성할 수 없기 때문에 자손클래스가 상속받아야 사용 가능

추상메소드(abstract method)

선언부만 작성하고 구현부는 작성을 하지 않은 것

abstract를 메소드에 붙여서 추상메소드로 만들면 자손클래스에서 반드시 이 메소드를 구현해야 함

 

인터페이스

일종의 추상클래스로, 추상클래스보다 추상화 정도가 높아 모든 메소드가 다 추상메소드이며 상수만을 멤버로 가질 수 있음

따라서 모든 멤버변수는 public static final, 메소드는 public abstract여야 하는데 이를 생략하는 것도 가능함

클래스와는 다르게 여러 개의 인터페이스로부터 상속받음으로써 다중상속이 가능함

 

728x90
반응형