Search
Duplicate
😀

06. 상속, 인터페이스, Singleton

태그
OOP is A P.I.E
Abstraction(추상화) ㄴ 현실의 객체를 추상화하여 클래스를 구성한다. Polymorphism(다형성) ㄴ 하나의 객체를 여러 가지 타입(형)으로 참조할 수 있다. Inheritance(상속) ㄴ 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능 Encapsulation(데이터 은닉과 보호) ㄴ 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호할 수 있다.
Java의 상속
상속 ㄴ 기존 클래스의 자산(멤버)을 자식 클래스에서 재사용하기 위한 것 ㄴ 부모의 생성자와 초기화 블록(Initializer)는 상속되지 않는다 ㄴ 기존 클래스의 멤버를 물려받기 때문에 코드의 절감 효과가 있다 ㄴ 부모의 코드를 변경하면 모든 자식들에게 적용된다 ⇒ 유지보수성 향상 ㄴ 상속의 관계는 is a 관계로 이루어진다. (ex. 사람 is a 포유류) 단일 상속 ㄴ 자바는 기본적으로 단일 상속만 지원한다. ㄴ 대신 interface와 포함 관계(has a)로 단점을 극복한다. 포함 관계 ㄴ 상속 이외에 클래스를 재활용하는 방법 ㄴ 2개 이상 클래스에서 특성을 가져오는 경우 하나는 상속, 나머지는 멤버 변수로 처리
Annotaion
Annotation ㄴ 사전적 의미 : 주석 ㄴ 컴파일러, JVM, 프레임워크 등이 보는 주석 ㄴ 소스코드에 메타 데이터를 삽입하는 형태 ㄴ 소스 코드에 붙여놓는 라벨 ㄴ 코드에 대한 정보 추가 → 소스 코드의 구조 변경, 환경설정정보 추가 등의 작업 JDK 1.5의 기본 Annotation 예 1. @Deprecated ㄴ 컴파일러에게 해당 메서드가 deprecated 되었다고 알려줌 2. @Override ㄴ 컴파일러에게 해당 메서드는 override한 메서드임을 알려줌 ㄴ @Override가 선언된 경우 반드시 super class에 선언되어있는 메서드여야 함 3. @SuppressWarnings ㄴ 컴파일러에게 사소한 warning의 경우 신경쓰지 말라고 알려줌
super
super 키워드 ㄴ this를 통해 자신 객체에 접근했듯이, super를 통해 조상 클래스 멤버에 접근한다. 변수의 스코프 ㄴ 사용된 위치에서 점점 확장해가며 처음 만난 선언부에 연결된다. ㄴ method 내부 ⇒ 해당 클래스의 멤버변수 ⇒ 조상 클래스 멤버변수 super() ㄴ 조상 클래스의 생성자를 호출한다 ㄴ 자식 클래스 생성자의 첫줄에서만 호출 가능하다 ㄴ 명시적으로 this() 또는 super()를 호출하지 않은 경우 컴파일러가 자동으로 super()를 삽입한다 ⇒ 결론적으로 Object까지 객체 전부 생성!
상속 요약
상속 ㄴ 클래스 상속(일반화) ㄴ concrete 클래스 상속(온전한 클래스) : 재정의는 선택 ㄴ Abstract 클래스 상속(미완성 클래스) ㄴ 추상 메서드 있는 경우 : 재정의가 필수 ㄴ 추상 메서드 없는 경우 : 재정의는 옵션 ㄴ(설계상 의도적으로 추상 클래스로 만드는 경우) ㄴ 인터페이스 상속(구현) ㄴ 추상메서드와 상수로만 이루어짐 : 재정의가 필수
추상 메서드 & 추상 클래스
추상 메서드 ㄴ 구현부 없이 선언으로만 이루어진 메서드 ㄴ 구현 내용이 없더라도 구현부(body - {})가 존재하면 추상 메서드 아님! 추상 클래스 ㄴ 추상 메서드가 없어도 추상 클래스가 가능하다 ㄴ 하지만 추상 메서드가 하나라도 존재하면 추상 클래스이다 ㄴ new 키워드를 통해 객체 생성이 불가능하다 (반드시 상속받은 자식에서 구현해야함)
Interface & Adapter
Interface ㄴ 추상 메서드와 상수로 이루어진 특별한 타입 ㄴ 사용자 관점 : 사용 방법, 약속 ㄴ 제공자 관점 : 구현의 책임 ㄴ 구현과 사용의 분리를 제공한다. Adapter ㄴ 여러개의 Interface, 추상 클래스를 묶어 필요한 것들을 간단구현(body만 선언)해둠으로서 구현의 번거로움을 제거하기 위한 편의성 목적 ㄴ 위의 그림에서 A 에서 a()를 필요로 하고, B에서 e()만을 필요로 하는 경우에 나머지 필요없는 b(), c(), d(),,, 를 전부 구현해야 한다. ㄴ 이때 Adapter는 사전에 모든 함수의 body를 선언하여 간단구현해둠으로서 Adapter 상속 후 a()와 e()만을 구현하여 사용할 수 있다.
메서드 재정의의 5가지 조건
기본 전제조건 : 상속 1. 메서드 이름 → 동일 2. 매개변수 목록 → 동일 3. 리턴타입 → 동일 4. 접근지정자 → 부모보다 같거나 크게 5. throw 구문 → 같거나 or 작거나 or 안던지거나
객체의 생성 제어와 Singleton 디자인 패턴
Singleton 디자인 패턴이란? ㄴ 하나의 객체만 사용하는 디자인 패턴 ㄴ 여러개의 객체가 필요없는 경우에 사용된다. ㄴ 객체를 구별할 필요가 없는 경우 → 수정 가능한 멤버 변수 없고, 기능만 있는 경우 ㄴ 이러한 객체를 Stateless 객체라고 함 ㄴ 객체를 계속 생성/삭제하는데 많은 비용이 들어서 재사용이 유리한 경우 Singleton 디자인 패턴 구현 방법 ㄴ 외부에서 생성자에 접근 금지 → 생성자의 접근 제한자를 private ㄴ 내부에서는 private에 접근 가능하므로 직접 생성 → 멤버변수 private ㄴ 외부에서 private member 접근 가능한 getter 생성 → setter는 불필요 ㄴ 객체 없이 외부에서 접근 가능하도록 getter와 변수에 static ㄴ 외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용
다형성
다형성의 정의 ㄴ 상속관계에 있을 때 조상 클래스의 타입으로 자식 클래스의 객체를 레퍼런스 다형성의 활용 예시 - (1) 다른 타입의 객체를 다루는 배열 ㄴ 배열의 특징 ⇒ 같은 타입의 데이터를 묶음으로 다룬다. ㄴ 다형성으로 다른 type의 데이터 (Person, Spider,,,)를 하나로 관리 가능 ㄴ Object는 모든 클래스의 조상 ㄴ Object 배열은 어떤 타입의 객체라도 다 저장할 수 있다. ㄴ 자바의 자료구조를 간단하게 할 수 있음 (ex. Collections API) 다형성의 활용 예시 - (2) 매개변수의 다형성 ㄴ System.out.println() ㄴ 메서드가 호출되기 위해서는 메서드 이름과 파라미터에 따라 모든 경우의 수 오버로딩 ㄴ 하지만 이런 경우에 파라미터를 최상위 조상인 Object 타입으로 처리하면 ㄴ 객체의 타입에 따라 메서드를 중복 정의할 필요가 없어진다.
다형성과 참조형 객체의 형 변환
Person person = new Person(); // 문제 코드 SpiderMan sman = (SpiderMan) person; sman.fireWeb(); // 좋은 코드 if(person instanceof SpiderMan){ SpiderMan sman = (SpiderMan) Person; }
Java
복사
참조형 객체의 형 변환 ㄴ 자손 타입의 객체를 조상 타입으로 참조 : 묵시적 형변환 ⇒ 조상의 모든 내용이 자식에게 있기 때문에 데이터 손실 걱정 X ㄴ 조상 타입의 객체를 자손 타입으로 참조 : 명시적 형변환 (데이터 손실 가능) person에서 자손 타입인 SpiderMan으로 명시적 형변환을 수행해주었다. 하지만 sman에서 fireWeb() 함수를 호출한 경우 ClassCastException이 발생한다. ⇒ Person 객체를 생성하였기 때문에 메모리에는 Person과 Object만 할당되고, SpiderMan은 메모리에 올라가지 않은 상태! ⇒ 명시적 형변환을 수행해주는 경우 메모리에 올라와있는지를 먼저 체크해야함!! instanceof 연산자 ㄴ 위에서 말한 실제 메모리에 있는 객체가 특정 클래스 타입인지는 boolean으로 리턴
다형성과 참조형 객체의 형 변환
상속 관계에서 객체의 멤버가 중복되는 경우 ㄴ 변수 ⇒ 참조변수의 타입에 의해 결정 ㄴ 메서드 ⇒ 무조건 자식 클래스의 메서드가 호출 → virtual method invocation ⇒ 최대한 메모리에 생성된 실제 객체에 최적화 된 메서드가 동작 (오버라이딩 된 것이 최적이라고 생각) ** 메서드 구성 시 다형성의 성질 때문에 상위 타입의 클래스로 전부 처리할 수 있지만 그만큼 코드의 복잡도도 증가한다. =⇒ Java API처럼 공통 기능인 경우를 제외하고는 비즈니스 로직 상 최상위 객체 사용을 권장