본문 바로가기

Archived(CSE Programming)/Java

Java_OOP와 다형성

# OOP

은닉화, 상속, 다형성, 추상화

cf) 개발방법론 : scrum, CBD, agile, waterfall, ...

# 상속 - 어떤 Class 설계할 때 마다 A~Z 구현, But 상속이 있다면 손쉬운 확장

 

 

공통의 특징을 상위 class로 올리고 필요한 class에서 상속받기

(네트워크에서는 상속의 개념을 활용하지 않는다)

 

지역변수 / 전역변수

클래스 변수 / 멤버 변수

# 상속 - 객체의 다형성, 메서드의 다형성, 매개변수의 다형성

(byte, short, int, long / float, doublechar / String / boolean)

java 와 같은 컴파일 언어는 타입점검이 중요!

(정수형 상수는 int, 실수형 상수는 double) ex) 12.235f

int형은 char형과 형 변환 가능

 

포함을 기준으로 비교한다면 자식이 더 크다(더 많이 가지고 있으므로)

타입을 기준으로 비교한다면 부모가 더 크다(캐스팅 방향을 생각)

 

객체의 다형성 : 하나의 타입으로 여러 개의 sub type 객체를 생성할 수 있는 것

다형성은 상속을 통해 이해하기..!

# 다형성 - 배열

데이터를 추출해서 프론트단 까지 추출하는 것이 필요

이를 어떤 방식으로 전달? > 배열(Array)

 

가장 중요한 것은 단일 데이터 형식 담는다

여기서 다형성 접목!

public class ObjectAryMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PersonVO [] perAry  = new PersonVO[10];
		//
		StudentVO stu = new StudentVO("윤신웅", 27, 'm', "1994");
		TeacherVO tea = new TeacherVO("윤신웅2", 27, 'm', "자바");
		EmployeeVO emp = new EmployeeVO("윤신웅3", 27, 'm', "개발");
		//
		perAry[0] = stu ;	perAry[1] = tea;	perAry[2] = emp;
	}
}

만약 다형성(Overriding)이 없다면

import com.sinc.intern.oop.model.vo.PersonVO;
import com.sinc.intern.oop.sub.model.VO.EmployeeVO;
import com.sinc.intern.oop.sub.model.VO.StudentVO;
import com.sinc.intern.oop.sub.model.VO.TeacherVO;

public class ObjectAryMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PersonVO [] perAry  = new PersonVO[10];
		//
		StudentVO stu = new StudentVO("윤신웅", 27, 'm', "1994");
		TeacherVO tea = new TeacherVO("윤신웅2", 27, 'm', "자바");
		EmployeeVO emp = new EmployeeVO("윤신웅3", 27, 'm', "개발");
		//
		perAry[0] = stu ;	perAry[1] = tea;	perAry[2] = emp;
		printAry(perAry);
	}
	
	public static void printAry(PersonVO [] ary) {
		for(int idx = 0 ; idx < ary.length ; idx ++) {
			PersonVO obj = ary[idx] ;
			if(obj instanceof StudentVO) {
				((StudentVO)obj).stuInfo();
			}
			if(obj instanceof TeacherVO) {
				((TeacherVO)obj).teaInfo();
			}
			if(obj instanceof StudentVO) {
				((EmployeeVO)obj).empInfo();
			}
		}
	}
}

instanceof 연산을 통해 instance 별로 확인 후 메서드 호출(비효율)

오버라이딩은 선언부 같아야함(단 접근제어자는 자식 클래스에서 커질 수 있다)

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PersonVO [] perAry  = new PersonVO[10];
		//
		StudentVO stu = new StudentVO("윤신웅", 27, 'm', "1994");
		TeacherVO tea = new TeacherVO("윤신웅2", 27, 'm', "자바");
		EmployeeVO emp = new EmployeeVO("윤신웅3", 27, 'm', "개발");
		//
		perAry[0] = stu ;	perAry[1] = tea;	perAry[2] = emp;
		printAry(perAry);
	}
	
	public static void printAry(PersonVO[] ary) {
		for(int idx = 0 ; idx < ary.length ; idx++) {
			PersonVO obj = ary[idx] ;
			if(obj == null)
				break;
			System.out.println(obj.perInfo());
		}
	}
}

cf. 메소드의 다형성 = 오버로딩 ?

오버로딩은 상속이 아닌데 상속으로부터 다형성 고려할 수 있나?

# 매개변수의 다형성 

매개변수를 형 변환(Casting) 처리

a_method(double d) 를 int 형 변수로 호출 가능(자동 형 변환)

그러나 기본형 캐스팅 보다는 객체형 캐스팅이 유의미하다

# 추상화

interface > 상수(final), 추상 메서드 (단, 생성자를 가질 수 없다)

1) 강제성을 부여하기 위해(표준)

2) 객체 타입을 숨길 수 있는 은닉화를 위해

3) 객체의 다형성을 지향하기 위해

 

인터페이스 추상메서드 abstract

implements를 통해 인터페이스 구현

 

cf. 추상 클래스를 통한 문제점

Animal(인터페이스 fly를 담고 있는 추상클래스) -> Superman, Bird 상속 중에 Tiger 추가해야함

그러면 Tiger도 Animal 상속하게 되면 fly를 구현해야 하는 모순 발생

따라서 인터페이스를 통한 다형성 구현!

 

 

'Archived(CSE Programming) > Java' 카테고리의 다른 글

Java_예외처리  (0) 2020.01.17
Java_다형성과 컬렉션  (0) 2020.01.16
Java_자바의 기본  (0) 2020.01.13
Java 깊은 복사와 얕은 복사  (2) 2019.11.03
Java 마커 인터페이스  (0) 2019.11.03