객체지향 프로그래밍Ⅱ
1.상속
상속 - 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
상속의 장점 : 코드의 재사용성, 코드의 중복 제거, 유지보수 용이 => 객체지향 언어의 장점
1) 상속을 구현하는 방법 - 상속 받을 클래스 extends 상속하는 클래스명

상속하는 클래스 ‘조상 클래스’
상속받는 클래스 ‘자손 클래스’
위에서 Parent는 조상 클래스이며, Child는 자손 클래스이다.
2) 상속 특징
-자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
-조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받는다.
반대로 자손 클래스가 변경되더라도 조상 클래스에 아무런 영향을 주지 못한다.
-그러므로 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 자바에서는 단일 상속만 허용한다.

3) 포함관계
클래스를 재사용 하는 방법 - 상속, 포함관계
포함관계 (composite) - 클래스 간의 포함관계가 된다는 것은
한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것이다.

Circle 클래스를 작성하는데 Point 클래스 타입의 참조변수를 선언하여 포함하였다.
3-1) 포함관계 vs 상속
클래스를 작성하는데 상속관계를 맺을 건지, 포함관계를 맺을 건지 고민될 때가 있다.
이때 ‘is-a’와 ‘has-a’를 기준으로 판단하면 관계를 구분할 수 있다.
예시 ) 원은 점이다. Circle is a Point
원은 점을 가지고 있다 Circle has a Point
상속 관계 - ‘~은 ~이다’ ‘is-a’
포함 관계 - ‘~은~을 가지고 있다’ ‘has-a’
따라서 예시에서 Circle과 Point는 포함관계이다(composite)
4) Object 클래스 (모든 클래스의 조상)
-Object 클래스는 상속계층도에서 가장 최상위에 있는 조상클래스이다.
-다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받는다.
컴파일러가 extends Object를 자동 추가하여 상속받게 된다.
-만약 다른 클래스로부터 상속을 받더라도, 결국 마지막 최상위 조상은 Object 클래스이다.
다만, 이 경우에는 컴파일러가 extends Object를 추가하지는 않는다.
- 결국 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 , Object 클래스에 정의된 멤버들을 사용할 수 있다.
>>주요 메서드의 예시) toString(), equal(Object o) 가 있다.
cf. toString() 메서드
toString 메서드는 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드 입니다. 하지만 "String" 클래스나 "File"클래스에서는 "toString"에 메소드를 재정의 하여 의미있는 값을 리턴한다.
5) 오버라이딩(Overriding)
오버 라이딩 - 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
상속받은 메서드를 그대로 사용하기도 하지만,
자손 클래스 자신에 맞게 변경하는 경우가 있을 때 조상 메서드를 오버라이딩한다.

Point 클래스의 getLocation은 한 점의 x,y좌표를 문자열로 반환하도록 작성되었다.
Point3D클래스는 Point클래스로부터 상속받은 자손클래스이다.
이에 따라 getLocation()을 상속 받았지만, Point3D는 3차원 좌표계를 표현해야 하므로 맞지 않다.
그래서 자손클래스 Point3D에 맞게 z측 좌표값도 포함하여 반환하도록 오버라이딩한 것이다.
오버라이딩 성립 조건
1-오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로
메서드의 선언부(이름, 매개변수, 반환타입)은 조상의 것과 완전히 일치해야 한다.
2- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3- 조상 클래스의 메서드보다 많은 예외를 선언할 수 없다.
5-1) 오버로딩(Overloading) vs 오버라이딩(Overriding)
오버로딩 - 기존에 없던 새로운 메서드를 정의하는 것 : NEW
오버라이딩 - 상속받은 메서드의 내용을 변경하는 것 : CHANGE, MODIFY

2. super
1) 참조변수 super
- 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 변수이다.
멤버 변수가 지역변수의 이름과 같을 때 this를 붙여서 구별했던 것과 유사하다.
상속 받은 멤버의 이름과 자신의 멤버 이름이 같을 때 super를 통해 구별한다.

2) super() - 조상의 생성자
-this() 처럼 super()도 생성자이다.
this()가 같은 클래스의 다른 생성자를 호출했던 것처럼
super()는 조상의 생성자를 호출하는데 사용한다. 참고로 생성자는 상속되지 않는다.


3. import문
import 문 - 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것
1) import문의 사용 목적
다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다
그러나 매번 클래스명 앞에 패키지명을 적는 것은 번거로운 일이고, 이를 import문이 해결해준다.
2) import문 사용
-클래스의 코드 작성하기 이전에 import문으로 사용하고자 하는
클래스의 패키지를 미리 명시하면 소스코드에 사용되는
클래스이름에서 패키지명은 생략할 수 있다.
3) import문 선언 : import.패키지명.클래스명;
or
import.패키지명.*;
(*은 패키지 내 모든 클래스를 의미한다)
cf. 단축키 :ctrl+shift+o (이클립스에서 자동으로 import문을 추가)
**static import문 사용하면 static 멤버를 호출할 때 패키지를 클래스 이름을 생략할 수 있다.
4. 제어자(modifier)
제어자 - 접근제어자 public, protected, default, private
-그외 static, final, abstract
1)접근 제어자(access modifier)
private 같은 클래스 내에서만 접근이 가능하다
(default) 같은 패키지 내에서만 접근이 가능하다
protected 패키지와 관계 없이, 상속 관계에 있는 자손클래스에서 접근 가능하다
public 접근 제한이 전혀 없다
cf. 접근제어자가 default라는 것은 아무런 접근 제어자도 붙이지 않는 것을 의미한다.
1-2) 캡슐화와 접근 제어자
접근 제어자 사용 목적
-외부로부터 데이터를 보호하기 위해서
-외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위 해서
**참고**
get으로 시작하는 메서드는 멤버변수의 값을 반환하는 역할을 수행한다.
겟터(getter) 라고 부른다
set으로 시작하는 메서드는 조건에 맞는 값일 때만
멤버변수의 값을 변경하도록 수행한다. 셋터(setter)라고 부른다
2) final - 마지막의, 변경될 수 없는
final - 변수에 사용되면 값을 변경할 수 없는 상수가 되며,
메서드에 사용되면 오버라이딩할 수 없게 되고,
클래스에 사용하면 자손클래스를 정의하지 못하게 된다.
>>final 클래스의 대표적인 예 ) String, Math
3) abstract - 추상의, 미완성의
제어자 | 대상 | 의미 |
abstract |
클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미한다 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다 |

추상 클래스는 미완성된 메서드가 존재하는 미완성 설계도이기 때문에
인스턴스를 생성할 수도 없다.
5. 다형성(Polymorphism)
다형성- 여러 가지 형태를 가질 수 있는 능력.
-자바에서는 한 타입의 참조변수로 여러 타입의 객체를
참조할 수 있도록함으로써 다형성을 프로그램적으로 구현
-달리 말해, 조상클래스 타입의 참조변수로
자식클래스의 인스턴스를 참조할 수 있다는 것을 의미한다
예시 )
Tv t = new Tv();
SmartTv s = new SmartTv();
생성된 인스턴스를 다루기 위해
인스턴스 타입과 일치하는 타입의 참조변수만을 사용했다.
즉 Tv의 인스턴스를 다루기 위 해서는 Tv의 참조변수를 사용하고,
SmartTv의 인스턴스를 다루기 위 해서는 SmartTv의 참조변수을 사용했다.
그러나, Tv와 SmartTv가 상속관계에 있다고 가정하자.
Tv 타입의 참조변수는 SmartTv 인스턴스를 참조하는 게 가능하다. (a.k.a다형성)
Tv t = new SmartTv(); // 생성된 인스턴스와 그것을 참조하는 참조변수의 타입의 불일치.
1)같은 타입의 참조변수 참조 vs 조상 타입의 참조변수 참조
SmartTv s = new SmartTv(); //참조변수와 인스턴스 타입 일치
Tv t = new SmartTv(); //참조변수와 인스턴스 타입 불일치
이때, s와 t는 같은 인스턴스를 참조하고 있다.
그러나 참조변수 t는 SmartTv의 인스턴스의 모든 멤버를 사용할 수 없다.
Tv클래스의 멤버들로부터 상속받은 SmartTv 인스턴스 멤버만을 사용할 수 있다.
즉, 같은 타입의 참조변수 참조와 조상 타입의 참조변수 참조는
사용할 수 있는 멤버의 개수가 다르다는 차이점이 있다.
cf. 자식 타입의 참조변수가 조상 클래스의 인스턴스를 참조할 수 있는가? 불가하다.
실제 인스턴스인 Tv의 멤버 개수보다 참조변수 s가 사용할 수 있는 멤버 개수가 더 많기 때문이다.
2) 참조변수의 형변환
-참조변수의 형변환 가능하다. 서로 상속 관계에 있는 클래스 사이에서만 가능하다는 것에 주의하자.
조상타입의 참조변수 -> 자식타입의 참조변수 (0K)
자식타입의 참조변수 -> 조상타입의 참조변수 (0K)


3) instanceof 연산자
-참조변수가 참조하는 인스턴스의 실제 타입을 확인하기 위해 사용.
주로 조건문에 사용. 연산의 결과로 True/False를 반환한다.
True라는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
-형태 : 참조변수 instanceof 타입(클래스명)
cf. 값이 null인 참조변수에 대해 instanceof연산 수행하면 false 결과로 얻는다.
4)매개변수의 다형성
참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손타입 인스턴스를 넘겨줄 수 있다.



4-1) 여러 종류의 객체를 배열로 다루기
조상타입의 참조 변수로 자손 타입의 객체를 참조하는 것이 가능하다.

따라서 왼쪽을 오른쪽으로 표현 가능하다.
이처럼 조상타입 참조변수 배열을 사용하면,
공통된 조상을 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있다.
6. 추상 클래스(abstract class)
1) 추상 클래스 - 미완성된 설계도.
이는 미완성된 메서드(선언부만 있는 추상 메서드)를 포함하고 있다는 의미이다.
2) 추상 클래스 특징
-추상클래스는 상속을 통해 자식클래스에 의해서만 완성될 수 있다.
-추상클래스는 추상 메서드를 포함하고 있다는 것을 제외하곤,
일반 클래스와 전혀 다르지 않다.
-추상 클래스에도 생성자가 있으며, 멤버변수와 매서드를 가질 수도 있다.
-추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해
조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다.
3) 추상 메서드 - 선언부만 작성하고 구현부는 작성되지 않은 것.
미완성 메서드를 남겨두는 이유는
상속받는 클래스에 따라 달라질 수 있기 때문이다.
즉, 추상클래스를 상속받는 자손 클래스는
조상의 추상메서드를 자신의 상황에 맞게 구현해야 한다.
>> 추상메서드 형태 : abstract 리턴타입 메서드이름();
3) 추상 클래스 작성
상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면,
추상화는 기존의 클래스의 공통된 부분을 추출해 조상 클래스를 만드는 것

7.인터페이스
1) 인터페이스 특징
-인터페이스는 일종의 추상클래스이다.
-인터페이스 작성 방법 : 클래스 작성법과 동일하지만, class 대신 interface를 사용할 뿐이다
-인터페이스도 추상 메서드를 갖지만, 추상클래스보다 추상화 정도가 높아서
일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
-인터페이스는 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 그 외 허용 않음.
- 추상 클래스를 ‘미완성 설계도’라고 한다면, 인터페이스는 밑그림만 있는 ‘기본 설계도’ 라고 할 수 있다.
-인터페이스는 다른 클래스를 작성하는데 도움을 줄 목적으로 사용된다.
2)주의사항
-인터페이스의 모든 멤버변수들은 public static final여야 하며, 생략할 수 있다.
-모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
-인터페이스는 인터페이스로부터만 상속받을 수 있다. 그리고 다중상속이 가능하다.
-인터페이스도 추상 메서드를 구현하는 클래스가 필요한데,
그 방법은 추상클래스가 상속받는 클래스를 정의하는 것과 동일하다.
다만 extends 대신 implements를 사용할 뿐이다.
- 상속과 구현을 동시에 해낼 수 있다.
3) 인터페이스를 이용한 다형성
다형성을 학습할 때 조상 클래스의 참조 변수가
자식 클래스의 인스턴스를 참조할 수 있다는 것을 배웠다.
마찬가지로 인터페이스는 자신을 구현한 클래스의 인스턴스를
참조할 수 있으며, 인터페이스 타입으로 형변환도 가능하다.
-인터페이스는 메서드의 매개변수의 타입으로 사용될 수 있다.
인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시
해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다.
-리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를
구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
4) 디폴트 메서드와 static 메서드
인터페이스는 추상 메서드만 선언 가능했으나,
JDK1.8부터 디폴트 메서드와 static 메서드 추가할 수 있게 되었다.
static 메서드는 인스턴스와 무관하므로 인터페이스에 추가해도 사실 문제가 없다.
-디폴트 메서드 : 추상메서드의 기본적인 구현을 제공하는 메서드.
추상 메서드가 아니기 때문에 디폴트 메서드가 추가되더라도
해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
- 형태 : (public) default newMethod(){} //public은 생략 가능
8. 내부 클래스(inner class)
내부 클래스 - 클래스 내에 선언된 클래스
1)장점 - 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.(캡슐화)
2)내부클래스의 종류
인스턴스 클래스 - 외부클래스의 멤버변수 선언위치 선언. 외부클래스의 인스턴스 멤버처럼 다루어짐
스택틱 클래스 - 외부 클래스의 멤버 변수 선언위치에 선언. 외부클래스의 static 멤버처럼 다루어짐
지역 클래스 - 외부 클래스의 메서드나 초기화 블럭 안에 선언. 선언된 내부에서만 사용 가능
익명 클래스 - 클래스의 선언과 객체 생성을 동시에 하는 무명 클래스


9.익명 클래스(anonymous class)
클래스 선언과 동시에 객체를 생성. 일회용 클래스
특징
-생성자를 가질 수 없다
-조상클래스의 이름이나 인터페이스의 이름을 사용해서 정의한다.
-따라서 상속을 받는 동시에 인터페이스를 구현할 수 없다.
-단 하나의 클래스를 상속받거나 단 하나의 인터페이스만 구현 가능하다.
'Java' 카테고리의 다른 글
re: Java 연산자 (0) | 2022.04.07 |
---|---|
re: Java 변수 (0) | 2022.04.07 |
Java 객체지향 프로그래밍Ⅰ (0) | 2022.04.05 |
Java 참조 타입이란 무엇인가 (0) | 2022.04.04 |
Java 조건문과 반복문이란 무엇인가 (0) | 2022.04.01 |