객체 지향 프로그래밍 특징
상속
추상화
다형성
다형성
하나의 객체가 여러 타입을 가질 수 있는 것을 의미함
자바에서는 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 가능 -> 역은 성립하지 않음
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 키워드를 가지지 않는 클래스
지역 클래스 : 외부 클래스의 메소드나 초기화 블록에 선언된 클래스
익명 클래스 : 일회용 클래스
[Java] Java 주요 개념 요약 정리 (컬렉션) (0) | 2022.10.31 |
---|---|
[Java] Java 주요 개념 요약 정리 (제네릭) (0) | 2022.10.21 |
[Java] Java 주요 개념 요약 정리 (클래스) (0) | 2022.10.19 |
[Java] Java 주요 개념 요약 정리 (개요, 자료형, 조건문, 배열) (0) | 2022.10.18 |
[Java] 자료형 변환 (Casting) (0) | 2022.01.21 |