상속 (Inheritance)
Object 클래스는 자바의 클래스 상속계층도의 최상위 위치
모든 클래스는 Object 클래스에게서 상속받는다
Object 클래스 대표 메서드
메서드명 | 반환타입 | 내용 |
---|---|---|
toString() | String | 객체정보를 문자열로 출력 |
equals(Object o) | boolean | 등가 비교 연산과 동일하게 스택 메모리값 비교 |
hashCode() | int | 객체 위치정보관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
wait() | void | 현재 쓰레드 일시정지 |
notify() | void | 일시정지 쓰레드 재동작 |
포함관계 (composite)
관계판별기준(클래스간의 관계상태) | 적합관계 |
---|---|
~는 ~이다 (IS-A) | 상속관계 |
~는 ~를 가지고있다 (HAS-A) | 포함관계 |
메서드 오버라이딩 (Method Overriding)
public class InheritanceExample {
public static void main(String[] args) {
Apple apple = new Apple(); // 각각의 타입으로 선언 + 객체 생성
Banana banana = new Banana();
Orange orange = new Orange();
// 오버라이딩되어 각각 다른 출력
apple.taste();
banana.taste();
orange.taste();
> 출력
> Apple is sweet!
> Banana is sweet!
> Orange is sweet!
-------------------------------------------------------
Fruit apple2 = new Apple(); // 상위 클래스 타입으로 선언 + 각각 타입으로 객체 생성
Fruit banana2 = new Banana();
Fruit orange2 = new Orange();
apple2.taste();
banana2.taste();
orange2.taste();
> 출력
> Apple is sweet!
> Banana is sweet!
> Orange is sweet!
------------------------------------------------------
// 배열로 한번에 관리하기
Fruit[] fruits = new Fruits[] {new Apple(), new Banana(), new Orange()};
for (Fruit fruit : fruits) {
fruit.taste();
}
> 출력
> Apple is sweet!
> Banana is sweet!
> Orange is sweet!
}
}
class Fruit {
void taste() {
System.out.println("Fruit is sweet!");
}
}
class Apple extends Fruit {
void taste() {
System.out.println("Apple is sweet!");
}
}
class Banana extends Fruit {
void taste() {
System.out.println("Banana is sweet!");
}
}
class Orange extends Fruit {
void taste() {
System.out.println("Orange is sweet!");
}
}
super 키워드 : 상위 클래스의 객체 호출
public class Super {
public static void main(String[] args) {
Lower low = new Lower();
low.callNum();
}
}
class Upper {
int count = 20; // super.count
}
class Lower extends Upper {
int count = 10; // this.count
void callNum() {
System.out.println("count = " + count);
System.out.println("this.count = " + this.count);
System.out.println("super.count = " + super.count);
}
}
> 출력
> count = 15
> count = 15
> count = 20
super() 메서드 : 상위 클래스의 생성자 호출
public class SuperMethod {
public static void main(String[] args) {
CoffeeMilk m = new CoffeeMilk();
}
}
class Coffee {
Coffee() {
System.out.println("커피 생성자");
}
}
class CoffeeMilk extends Coffee { // Coffee 로부터 확장(상속)
CoffeeMilk() {
super(); // Coffee 클래스의 생성자 호출
System.out.println("커피우유 생성자");
}
}
> 출력
> 커피 생성자
> 커피우유 생성자
캡슐화 (Encapsulation)
패키지 (package)
.
으로 구분됨package java.util.*;
Import문
package practicePackage.test; // package문
import practicePackage.test2; // import문 작성
public class PackageImp {
...생략...
}
접근제어자 (Access Modifier)
접근제어자 | public, protected, default(미작성 시 기본설정), private |
---|---|
기타제어자 | static, final, abstract, native, transient, synchronized 등 |
접근제어자 | 클래스 내 | 패키지 내 | 다른 패키지의 하위 클래스 | 패키지 외 |
---|---|---|---|---|
Private | O | X | X | X |
Default | O | O | X | X |
Protected | O | O | O | X |
Public | O | O | O | O |
getter / setter 메서드
public class updateNum {
public static void main(String[] args) {
GetSetNum getSetNum = new GetSetNum(25);
System.out.println(getSetNum.getNum());
getSetNum.setNum(50);
System.out.println(getSetNum.getNum());
}
}
class GetSetNum {
private int num;
GetSetNum(int num) {
this.num = num;
}
// getter 사용시 메서드명은 get-
public int getNum() {
return this.num;
}
// setter 사용시 메서드명은 set-
public void setNum(int num) {
this.num = num;
}
}
> 출력
> 25
> 50
다형성 (Polymorophism)
참조변수의 타입 변환 : 사용할 수 있는 멤버의 개수를 조절하는 것
public class CastingExample{
public static void main(String[] args) {
ParentClass parentClass = new ParentClass();
ChildClass childClass = new ChildClass();
ParentClass upcasting1 = childClass;
ParentClass upcasting2 = (ParentClass) childClass;
//ChildClass downcasting1 = parentClass; // 형변환연산자 생략 불가 Incompatable Type
ChildClass downcasting2 = (ChildClass) parentClass; // ClassCastException 발생
}
instanceof 연산자
public class InstanceOfExample {
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println(animal instanceof Object); //true
System.out.println(animal instanceof Animal); //true
System.out.println(animal instanceof Bat); //false
Animal cat = new Cat();
System.out.println(cat instanceof Object); //true
System.out.println(cat instanceof Animal); //true
System.out.println(cat instanceof Cat); //true
System.out.println(cat instanceof Bat); //false
}
}
class Animal{};
class Bat extands Animal{};
class Cat extends Animal{};
추상화(Abstraction)
abstract 제어자
메서드 앞에 붙은 경우 '추상 메서드(abstract method)'
클래스 앞에 붙은 경우 '추상 클래스(abstract class)'
추상클래스 사용 이유
final 키워드
위치 | 의미 |
---|---|
클래스 | 변경 또는 확장 불가능한 클래스, 상속 불가 |
메서드 | 오버라이딩 불가 |
변수 | 값 변경이 불가한 상수 |
Interface
Interface 구현
Interface 구현 장점