Language/JAVA

[JAVA] Chapter 7. 객체 지향 프로그래밍Ⅱ

:_: 2022. 5. 24. 11:17
자바의 정석을 공부하면서 공부내용을 정리했습니다.

 

🌱 상속

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

코드를 공통적으로 관리할 수 있어서 코드의 추가 및 변경이 매우 용이 

→ 코드의 재사용성을 높이고 코드의 중복을 제거하여 생산성과 유지보수에 좋다

 

상속받고자 하는 클래스의 이름을 extends와 함께 써주면 된다.

상속해주는 클래스는 부모 클래스, 상속 받는 클래스는 자식 클래스라고 한다.

 

자식 클래스는 부모클래스의 모든 멤버를 상속받기 때문에 자식 클래스는 부모클래스의 멤버들을 포함한다.

자식 클래스에 새로운 코드를 추가해도 부모 클래스엔 영향을 주지 않는다.

생성자와 초기화 블럭은 상속되지 않는다.

 

상속 이외에도 클래스간에 포함관계를 맺어주면 클래스를 재사용할 수 있다.

 

클래스를 가지고 문장을 만들 때 '~은 ~이다.' 라는 문장이 성립하면 서로 상속관계, '~은 ~을 가지고 있다.'는 문장이 성립하면 서로 포함관계를 맺어준다.

 

java는 단일 상속만 허용하므로 하나 이상의 클래스로부터 상속을 받을 수 없다.

 

Object 클래스는 모든 클래스의 최상위에 있는 클래스이다.

상속받지 않는 클래스들은 자동적으로 Object 클래스로부터 상속받는다.

 

😀 상속 코드 깃 주소

 

🌱 오버라이딩(overriding)

부모 클래스에 정의된 메서드와 같은 메서드를 자식 클래스에 정의하는 것

오버라이딩은 메서드의 내용만 새로 작성하는 것이므로 메서드의 선언부는 부모와 완전히 일치해야 한다.

 

조건1. 부모클래스의 메서드와 이름이 같아야 한다.

조건2. 부모클래스의 메서드와 매개변수가 같아야 한다.

조건3. 부모클래스의 메서드와 반환타입이 같아야 한다.

 

접근제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

 

오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것

 

super

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수

멤버변수와 지역변수의 이름이 같을 땐 this로 구분

상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 땐 super를 붙여 구별

 

super() : 부모 클래스의 생성자를 호출하는데 사용

부모 클래스의 맴버변수는 조상의 생성자에 의해 초기화되도록 해야 한다.

 

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

그렇지 않으면 컴파일러가 자동적으로 super()를 생성자의 첫 줄에 삽입한다.

 

😀 오버라이딩 코드 깃 주소

 

🌱 제어자

클래스, 변수 또는 메서드의 선언부와 함께 사용되어 부가적인 의미를 부여한다.

 

1.static : 클래스의, 공통적인

static이 사용될 수 있는 곳 - 맴버변수, 메서드, 초기화 블럭

static초기화 블럭 : 클래스가 메모리에 로드될 때 단 한번만 수행, 클래스변수(static변수)를 초기화하는데 주로 사용

class StaticTest {
	static int width = 200;			// 클래식 변수(static 변수)
        static int height = 120;		// 클래식 변수(static 변수)

        static {						// 클래스 초기화 블럭
            // static 변수의 복잡한 초기화 수행
        }

        static int max(int a, int b) {	// 클래스 메서드(static 메서드)
            return a > b ? a : b;
        }
}

 

2. final : 마지막의, 변경될 수 없는

final이 사용될 수 있는 곳 - 클래스, 메서드, 맴버변수, 지역변수

final class FinalTset {				// 조상이 될 수 없는 클래스
	final int MAX_SIZE = 10;		// 값을 변경할 수 없는 멤버변수(상수)
    
        final void getMaxSize() {		// 오버라이딩 할 수 없는 메서드(변경불가)
            final int LV = MAX_SIZE;	// 값을 변경할 수 없는 지역변수(상수)
            return MAX_SIZE;
        }
}

 

생성자를 이용한 final 맴버 변수의 초기화 

final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있다.

                                       

3. abstract : 추상의, 미완성의

 

메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상 메서드를 선언하는데 사용된다.

abstract 가 사용될 수 있는 곳 - 클래스, 메서드       

 

4. 접근 제어자  

멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활을 한다.

 

private : 같은 클래스 내에서만 접근 가능

default : 같은 패키지 내에서만 접근 가능

protected : 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근 가능

public : 제한 없다.

 

접근 제어자가 지정되어 있지 않다면 접근 제어자가 default 임을 뜻한다.

 

접근 제어자를 사용하는 이유는 외부로부터 데이터를 보호하고 외부에는 불필요하고 내부적으로만 사용되는 부분을 감추기 위해서이다.

 

1. static메서드는 몸통이 있는 메서드에서만 사용할 수 있기 때문에 메서드에 static과 abstract를 함께 사용할 수 없다

2. abstract과 final을 동시에 사용할 수 없다.

3. abstract 메서드의 접근 제어자가 pivate 일 수 없다.

4. private메서드는 오버라이딩 될 수 없기 때문에 private과 final을 같이 사용할 필요는 없다.

 

😀 제어자 코드 깃 주소

 

🌱 다형성(polymorphism)

여러 가지 형태를 가질 수 있는 능력

 

같은 타입의 인스턴스여도 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.

참조변수가 사용할 수 있는 멤버의 개수는 인스턴스 멤버 개수보다 같거나 적어야 한다.

 

instnaceof 연산자

주로 조건문에서 사용. instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입이 피연산자로 위치

연산 결과로 boolean값인 true, false 중의 하나를 반환

어떤 타입에 대한 instanceof연산의 결과가 true 라는 것은 검사한 타입으로 형변환이 가능하다는 것을 말한다.

 

😀 다형성 코드 깃 주소

 

🌱 추상 클래스(abstract class)

추상 클래스란?

추상클래스의 키워드는 abstract를 붙이기만 하면 된다. 

 

abstract class 클래스명 {

 

}

 

abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있다.

추상클래스에도 생성자가 있고 멤버변수와 메서드도 가질 수 있다.

 

추상메서드

선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 두는 것

추상메서드는 구현부가 없으므로 중괄호 대신 ; 을 기재

abstract 리턴타입 메서드이름();

 

🌱 인터페이스(interface)

추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높다.

클래스를 작성하는 것과 같다. class 대신 interface를 사용하면 된다. 접근제어자 public, detault 사용 가능하다.

 

인터페이스의 멤버변수들은 public static final 이어야 한다. 생략 가능하다.

모든 메서드는 public abstract 여야하고 생략 가능하다. 단, static메서드와 디폴트 메서드는 예외이다.

 

인터페이스는 인터페이스로부터만 상속이 가능하고 다중상속이 가능하다.

 

클래스는 확장한다는 의미의 키워드 'extends'를, 인터페이스는 구현한다는 의미의 키워드 'implements'를 사용한다.

 

class 클래스명 implements 인터페이스명 {

  // 인터페이스에 정의된 추상메서드를 구현해야 한다.

}

 

디폴드 메서드

인터페이스에 메서드를 추가한다는 것은 추상메서드를 추가하는 것이고 이 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메서드를 구현해야하기 때문에 디폴트 메서드를 사용한다

디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서드가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.

 

😀 인터페이스 코드 깃 주소

 

🌱 내부 클래스(inner class)

클래스 내에서 선언된 클래스이다.

두 클래스가 긴밀한 관계에 있을 때 내부 클래스 사용한다.

 

내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있고 코드의 복잡성을 줄일 수 있다.

내부 클래스의 선언위치는 변수의 선언위치와 동일한 유효범위와 접근성을 갖는다.

 

😀 내부 클래스 코드 깃 주소

 

728x90