일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이벤트 루프
- socket.io
- Django
- nodejs
- Groovy
- 특징
- 스레드
- Knowledge Graph
- 예제
- 스크럼 마스터
- RDF
- 소켓
- express
- 파헤쳐보자
- java
- Router
- Stream
- C++
- 개발자
- 스크럼
- ngrinder
- 노드js
- 자바
- node
- Python
- benchmark
- 지식 그래프
- 노드
- scrum
- node.js
- Today
- Total
라봉이의 개발 블로그
java의 정석 7강. 객체지향프로그래밍2(중) 본문
객체지향은 c++과 유사한 점이 많으니 특징과 다른 점만 짚고 넘어가도록 하겠다.
5.다형성
5.1 다형성이란?
객체지향개념에서의 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.
=> 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
5.2 참조변수의 형변환
서로 상속관계에 있는 클래스 사이에서만 가능하다.
- 자손타입 -> 조상타입(업캐스팅): 형변환 생략가능
- 자손타입 <- 조상타입(다운캐스팅): 형변환 생략불가
class Car {
String color;
int door;
void drive() {
System.out.println("drive, Brrrr~");
}
void stop() {
System.out.println("Stop!!");
}
}
class FireEngine extends Car {
void water() {
System.out.println("Water!!");
}
}
class Ambulance extends Car {
void siren() {
System.out.println("siren!!");
}
}
public class Main {
public static void main(String[] args) {
Car car = null;
FireEngine fe1 = new FireEngine();
FireEngine fe2 = null;
car = fe1; // car = (Car) fe1;에ㅐ서 형변환이 생략된 형태이다.
fe2 = (FireEngine)car; // 형변환을 생략할 수 없다.
}
}
5.3 instanceof 연산자
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. 연산의 결과로 boolean 값인 true, false를 반환한다.
void doWork(Car c) {
if(c instanceof FireEngine) {
FireEngine fe = (FireEngine) c;
fe.water();
} else if (c instanceof Ambulance) {
Ambulance am = (Ambulance) c;
am.siren();
}
// ...
}
5.4 참조변수와 인스턴스의 연결
메서드의 경우 조상 클래스의 메서드를 자손의 클래스에서 오버라이딩한 경우에도 참조변수의 타입에 관계없이 항상 실제 인스턴스의 메서드(오버라이딩한 메서드)가 호출되지만, 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
class Parent {
int x = 100;
void method() {
System.out.println("Parent method");
}
}
class Child extends Parent {
int x = 200;
void method() {
System.out.println("Child method");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
출력 결과:
p.x = 100
Child method
c.x = 200
Child method
5.5 매개변수의 다형성
참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.
void buy(Product p) { // Product는 상품 클래스들의 조상 클래스이다.
money = money - p.price;
bonusPoint = bonusPoint + p.bonusPoint;
}
5.6 여러 종류의 객체를 하나의 배열로 다루기
ex)
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
6. 추상클래스
6.1 추상클래스란?
추상클래스는 키워드 'abstract'를 붙여주기만 하면 된다.
absctract class 클래스 이름 {
//....
}
6.2 추상메서드(abstract method)
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 "추상메서드"이다.
키워드 'abstract'를 앞에 붙여주고 주석으로 어떤 기능을 수행할 것인지 코멘트를 남긴다.
만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해줘야한다.
'Java > Java의 정석 읽고 정리' 카테고리의 다른 글
java의 정석 8강. 예외처리(상) (0) | 2018.06.03 |
---|---|
java의 정석 7강. 객체지향프로그래밍2(하) (0) | 2018.06.03 |
java의 정석 7강. 객체지향프로그래밍2(상) (0) | 2018.05.29 |
java의 정석 6강. 객체지향프로그래밍1 (0) | 2018.05.28 |
java의 정석 5강. 배열 (0) | 2018.05.27 |