AngelPlayer`s Diary

객체 지향 프로그래밍 특징

상속

추상화

다형성

 

다형성

다형성

하나의 객체가 여러 타입을 가질 수 있는 것을 의미함

자바에서는 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 가능 -> 역은 성립하지 않음

Parent pa = new Parent(); // O
Child ch = new Child(); // O
Parent pc = new Child(); // O
// Child cp = new Parent(); // Error

 

 

참조 변수

형태를 가지는 변수 (int형 변수는 자료형이 int / String형 변수는 형태가 String)

// angel은 int 자료형의 변수
int angel = 88;

// player는 String 형태의 변수
String player = new String("Hola");

일반 변수는 stack 영역에 일정 크기를 가지고 해당 위치에 값(value)을 저장

참조 변수는 heap에 값(value)를 저장하고, stack 영역에 일정 크기가 heap의 주소를 가짐

 -> 참조 변수는 주소 값을 저장하는 공간 (C의 포인터와 유사한 개념)

 

 

 

참조 변수의 타입 변환

서로 상속 관계에 있는 클래스 사이는 참조 변수의 타입을 변환할 수 있음

 

자식 타입 -> 부모 타입으로 타입 변환은 생략 가능함 

부모 타입 -> 자식 타입으로 타입 변환은 명시 필요 (어떤 자식으로 바뀔지 모르기 때문)

class Parent { }
class Brother extends Parent { }
class Sister extends Parent { }

..

Parent pa = new Parent();
Parent pa2 = null;
Sister si = new Sister();
Brother br = null;

pa2 = si; // 자식 -> 부모 | == "pa2 = (Parent)si;" 
br = (Brother)pa; // 부모 -> 자식 | 명시 필요
// br = (Brother)ch; // 자식 -> 자식 | 직접적인 상속 관계가 아님 -> 오류

 

 

instanceof 연산자

[사용법] 참조변수 instanceof 클래스명

참조 변수가 참조하는 인스턴스의 타입 확인 시 사용함

 

본인, 부모에 대해 타입 확인 시 true 출력

자식에 대해 타입 확인 시 false 출력

class Parent { }
class Brother extends Parent { }
class Sister extends Parent { }

..

Parent p = new Parent();
System.out.println(p instanceof Object); // true
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Brother); // false

Parent s = new Sister();
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Brother); // false

 

 

추상 클래스

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

추상 클래스는 인스턴스를 생성할 수 없음

 

 

추상 메소드

[사용법] abstract 반환타입 메소드명();

자식에서 반드시 오버라이딩을 해야만 사용 가능한 메소드

추상 메소드가 포함된 클래스를 상속받는 자식은, 추상 메소드를 반드시 구현해야 함

추상 메소드는 선언부만 있고 구현부는 생략

abstract int angelPlayer(); // 모든 자식 클래스는 angelPlayer 메소드를 무조건 오버라이딩

 

 

인터페이스

[작성법] 접근제어자 interface 인터페이스명 { }

[사용법] class 클래스명 implements 인터페이스명 { }

클래스 작성 시 기본이 되는 틀

오로지 추상 메소드와 상수만을 포함 가능

인터페이스 사용을 통해 메소드 호출의 모호성을 줄일 수 있음

 

자바는 클래스를 통한 다중 상속을 지원하지 않음 -> 인터페이스를 이용하여 다중 구현을 지원

※ extend는 하나만 가능하며 상속이라고 표현 | interface는 다중으로 가능하며 구현이라고 표현

// 인터페이스 생성
interface Animal { public abstract void cry(); }
interface Health { public abstract void hp(); }

// 인터페이스 구현
class Cat implements Animal { 
    public void cry() { }
}

// 다중 인터페이스 구현
class Cat implements Animal, Health { 
    public void cry() { }
    public void hp() { }
}

// 상속 및 구현
class Dog extend Condition implements Animal, Health { }

 

 

내부 클래스

클래스 내부에 포함된 또 다른 클래스

 

내부 클래스에서 외부 클래스의 멤버에 접근 가능

외부에서 내부 클래스 접근 불가

코드의 캡슐화 증가, 복잡성 감소

 

 

내부 클래스 종류

정적 클래스 : static 키워드를 가짐, 클래스 메소드로 사용 (클래스 전체가 사용하는 메소드) 

인스턴스 클래스 : static 키워드를 가지지 않는 클래스

지역 클래스 : 외부 클래스의 메소드나 초기화 블록에 선언된 클래스

익명 클래스 : 일회용 클래스

 

 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band