객체지향 프로그래밍 2

geonu·2022년 3월 9일
0
post-custom-banner

출처 : 자바의 정석
http://www.yes24.com/Product/Goods/24259565
https://cafe.naver.com/javachobostudy/20665

아래의 내용은 '자바의 정석'이라는 책의 내용을 간략하게 정리한 글입니다.

상속(inheritance)

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 좋음
키워드 : extends (확장한다)

class Child extends Parent {
	...
}

상속 받는 클래스 : 자손 클래스
상속해주는 클래스 : 부모 클래스

조상 클래스를 확장(extends)한다는 의미

특징

  • 생성자와 초기화 블럭은 상속되지 않음
  • 맴버만 상속
  • 자손 클래스의 맴버 개수 >= 조상 클래스의 맴버 개수

상속이외의 클래스 재사용

클래스의 맴버변수로 다른 클래스 타입의 참조변수를 선언하는 것(포함관계 Composite)

class test{
	test1 t = new test1();
    int a = 0;
}

상속이냐 포함이냐

클래스를 가지고 문장을 만들때
상속관계 : ~은 ~이다
포함관계 : ~은 ~을 가지고 있다

단일 상속

자바는 오직 단일 상속만 허용한다.
서로 다른 클래스로부터 상속받은 맴버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점이 존재하기 때문.

클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중상속보다 유리하다.

다중상속과 비슷한 기능을 원할 땐 포함관계를 사용해볼 수 있다.

오버라이딩(overriding)

조상 클래스로부터 상속받은 매서드의 내용을 변경하는 것

조건

  • 메서드명 동일
  • 매개변수 동일
  • 반환타입 동일
  • 접근 제어자 범위
    - 조상 클래스 메서드 <= 자손 클래스 메서드
  • 예외 개수
    - 조상 클래스 메서드 예외수 >= 자손 클래스 메서드 예외수
  • 인스턴스 메서드 <-> static 메서드 변경 불가

오버로딩과 오버라이딩

오버로딩 : 새로운 메서드 추가
오버라이딩 : 상속받은 메서드 수정

super

자손 클래스에서 부모 클래스의 맴버를 참조할 때 사용

super = 부모 클래스
this = 자신 클래스

super와 this는 static메서드에는 사용할 수 없고 인스턴스 메서드에서만 사용 가능

생성자

Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 this(), super()을 호출해야한다.
없으면 컴파일러가 만들어준다.

제어자

접근제어자 : public > protected > default > private
나머지 : static, final, abstract, native, transient, synchronized, volatile, strictfp

public : 접근 제한 없음
protected : 같은 패키지 내, 다른 패키지의 자손클래스까지
default : 같은 패키지 내
private : 같은 클래스 내

인스턴스 변수일 경우 final 맴버변수를 생성자를 이용하여 초기화할 수 있다.

클래스에는 public, default만 메서드, 맴버변수에는 public, protected, default, priavate를 붙일 수 있다.

abstract

'미완성'이라는 의미를 가지고 있으며, 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용
추상 메서드는 미완성 메서드를 가지고 있으므로 인스턴스를 생성할 수 없다.

접근 제어자 사용 이유

  • 외부로부터 데이터를 보호
  • 외부에서 불필요하고 내부에서만 사용하는 부분을 감추기 위함

접근 제어자 조합 주의사항

  • 메서드에서 static과 abstract를 같이 사용할 수 없음
  • 메서드에서 private와 final을 같이 사용할 수 필요 없음
  • 클래스에서 abstract와 final을 동시에 사용할 수 없음
  • abstract메서드의 접근 제어자가 private일 수 없음

다형성(polymorphism)

객체지향적 개념 : 여러 가지 형태를 가질 수 있는 능력
자바 개념 : 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다.
ex) 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조

Tv tv = new LGTv();		//가능
LGTv tv = new Tv();		//불가능

같은 타입의 인스턴스일지라도 참조변수의 타입에 따라 맴버의 개수가 달라진다.

참조변수가 사용할 수 있는 맴버 개수 <= 인스턴스 맴버 개수

참조변수 형변환

서로 상속관계에 있는 클래스 사이에서만 형변환 가능

up-casting : 자손 -> 조상 //형변환 생략가능
down-casting : 조상 -> 자손 //형변환 생략불가

참조변수 형변환은 참조변수의 타입만 변화시키 것이기 때문에 인스턴스에 영향을 주지 않는다.
형변환을 통해 참조변수의 맴버를 조절하는 것이다.

instanceof 연산자

참조변수가 참조하고 있는 인스턴스 타입을 알 수 있고 연산의 결과로 boolean 값을 리턴한다.
또한 instanceof의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미한다.

참조변수와 인스턴스

조상과 자손이 중복된 맴버변수를 사용할 때 참조변수 타입 클래의 맴버변수가 사용된다.

vector class

배열의 크기를 알아서 관리해주는 클래스

Vector itme = new Vector();

item.add(Object o);
item.remove(Object o);
item.isEmpty();
item.get(int index);
item.size();

추상클래스(abstract class)

클래스 : 설계도 / 추상클래스 : 미완성 설계도
미완성 메서도를 포함하고 있는 클래스
추상클래스는 인스턴스를 생성할 수 없고 추상클래스를 상속 받은 자손클래스만 인스턴스를 생성할 수 있다.

  • 추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
  • 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업

아무런 내용 없이 {}만 있어도 일반메서드로 간주된다.

인터페이스(interface)

일종의 추상클래스
추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 맴버변수를 구성원으로 가질 수 없다.
다른 클래스를 작성하는데 도움을 줄 목적으로 작성.

class 대신 interface를 사용

interface interfaceName {
	public static final int a = 0;
    public abstract test(int a);
}
  • 모든 맴버변수는 public static final 을 사용하며 생략가능
  • 모든 메서드는 public abstract 을 사용하며 생략가능(JDK 1.8부터 static, default 매서도는 예외)

상속

인터페이스는 인터페이스로만 상속 받을 수 있다.
클래스와 달리 다중 상속이 가능하다.

키워드 implements (구현한다)

매개변수가 인터페이스

메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야한다는 의미

리턴타입이 인터페이스

매서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 의미

장점

  • 개발시간 단축 (동시 개발 가능)
  • 표준화 가능
  • 관계없는 클래스(상속관계가 아닌 클래스) 관계 맺음 가능
  • 독립적인 프로그래밍 가능 (선언부, 구현부 분히)

default 메서드와 static 메서드

인터페이스에 추상메서드만 선언할 수 있었는데 JDK 1.8부터 default 메서드와 static 메서드도 추가할 수 있다.

static 메서드는 기존에도 인터페이스에 못 넣을 이유가 없었고 default 메서드는 필요에 의해 생기게 되었다.

인터페이스의 메서드를 수정하게 될 경우 인터페이스 구현부 부분을 전부 수정해야하는 작업이 필요했다. 하지만 인터페이스 메서드를 default 메서드로 만들면 인터페이스 구현부를 전부 수정해야하는 작업이 필요 없게 된다.
default 메서드는 일반 메서드처럼 몸통이 있어야한다.

interface testInterface{
	void method();
    default void method(){};
}
  • 여러 인터페이스의 default 메서드간 충돌
    - 인터페이스 구현부에서 default 메서드 오버라이드
  • default 메서드와 조상 클래스의 메서드 간의 충돌
    - 조상 클래스의 메서드가 상속되고, default 메서도는 무시된다.

내부 클래스(inner class)

내부 클래스는 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.

장점

  • 내부 클래스에서 외부 클래스의 맴버들을 쉽게 접근할 수 있다.
  • 코드이 복잡성을 줄일 수 있다. (캡슐화)

내부 클래스는 외부 클래스에서만 주로 사용되고 다른 클래스에서 잘 사용되지 않는 것이여야 한다.

익명 클래스(anonymous class)

단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스.
이름이 없기에 생성자도 가질 수 없다.
단 하나의 클래스를 상속 받거나 단 하나의 인터페이스만 구현할 수 있다.

class InnerClass{
	Object o1 = new Object(){ void method(){} };
    static Object o2 = new Object(){ void method(){} };
}
profile
시작이 있어야
post-custom-banner

0개의 댓글