반응형

# Object 클래스

  • 모든 클래스의 root 클래스
  • 상속 관계에서 최상위 클래스이다. (최초의 부모)
  • Object 클래스를 활용하여 프로그램을 유연하게 만들 수 있다.

## 클래스 설계 시 기본적으로 생략되는 곳 3가지.

import java.lang.*;	// 생략_1

public class A extends Object {	// extends Object 생략_2
	public A() {	// 생략_3
		super();
	}
    
	public void display() {
		System.out.println("A");
	}
	
	@Override
	public String toString() {
		return "재정의된 메서드.";
	}
}

## Object를 이용한 객체 생성

Object obj = new A();
obj.display();
((A)obj).display();
System.out.println(obj.toString());

## toString()

  • Object 클래스의 메서드 중 하나.
  • 재정의를 하지 않았을 경우 번지 출력.
  • 재정의 시 재정의된 메서드 실행.

## Object 클래스 (실습)

import java.lang.*;

public class A extends Object {
	public A() {
		super();
	}
	
	public void display() {
		System.out.println("A");
	}
	
	@Override
	public String toString() {
		return "재정의된 메서드.";
	}
}
public class TPC30 {
	public static void main(String[] args) {
		A a = new A();
		a.display();
		// 1. toString() 메서드 재정의 한 경우.
		//System.out.println(a.toString());	//재정의 된 메서드 출력
		System.out.println(a);	// 재정의 된 메서드 출력
		
		// 2. toString() 메서드 재정의 하지 않은 경우.
		System.out.println(a);	// 번지 출력 : kr.poly.A@279f2327
	
		Object obj = new A();	// UpCasting
		((A)obj).display();
		System.out.println(obj.toString());
		
	}
}

 

# Object 클래스 활용 (다형성 인수, 다형성 배열)

  • Object 클래스와, A, B 라는 클래스가 존재하고 상속관계이며, A와 B 클래스에 go() 메서드가 존재할때
// UpCasting
Object obj1= new A();
Object obj2= new B();

// DownCasting
A a = (A)obj1;
B b = (B)obj2;

## Object 클래스 다형성 인수

display(new A());
display(new B());

일때..

public void display(Object obj) {
	if (obj instanceof A) {
		((A)obj).go();
	} else {
		((B)obj).go();
	}
}

## Object 클래스 다형성 배열

Object[] obj = new Object[2];
obj[0] = new A();
obj[1] = new B();

for ( int i = 0; i < obj.length; i++ ) {
	if(obj[i] instanceof A) {
		((A)obj[i]).go();
	} else {
		((B)obj[i]).go();
	}
}

## Object 클래스 활용 (실습)

public class A {
	public void go() {
		System.out.println("A_go 메서드");
	}
}
public class B {
	public void go() {
		System.out.println("B_go 메서드");
	}
}
  • Object 클래스 다형성 인수
public class TPC31 {
	public static void main(String[] args) {
		A a = new A();
		display(a);
		B b = new B();
		display(b);
	}

	private static void display(Object obj) {	// 다형성 인수
		if (obj instanceof A) {
			((A)obj).go();
		} else {
			((B)obj).go();
		}
	}
}
  • Object 클래스 다형성 배열
public class TPC32 {
	public static void main(String[] args) {
		Object[] obj = new Object[2];	// 다형성 배열
		obj[0] = new A();
		obj[1] = new B();
		
		for(int i = 0; i < obj.length; i++) {
			if (obj[i] instanceof A) {
				((A)obj[i]).go();
			} else {
				((B)obj[i]).go();
			}
		}
		
		printGo(obj);
	}

	private static void printGo(Object[] obj) {
		for(int i = 0; i < obj.length; i++) {
			if (obj[i] instanceof A) {
				((A)obj[i]).go();
			} else {
				((B)obj[i]).go();
			}
		}
	}
}
반응형
반응형

# 추상 클래스

## 추상 클래스 활용 (일부 다형성 보장)

  • 키워드 : abstract - extends
  • Animal의 eat 메서드를 Dog, Cat 클래스가 상속받아 재정의(Override) 하게되면 아래와 같이 호출하여 작동.
// Animal에 존재하는 eat() 메서드.
public void eat() {
	System.out.println("?");
}

Animal dog = new Dog();
dog.eat();	// dog에서 재정의(Override)한 것으로 출력.

animal cat = new Cat();
cat.eat();	// cat에서 재정의(Override)한 것으로 출력.
  • 재정의를 하게 되면 하위클래스에서 재정의한 값으로 출력 됨.
  • 재정의를 하지 않게 되면 상위 클래스에서 정한 값으로 출력 됨.
  • 추상 메서드 (키워드 : abstract) : 상위 클래스에 존재하는 메서드를 하위 클래스에서 재정의 하지 않을 때, 상위 클래스에서 정한 값이 출력되지 않도록할 때, 상위 클래스에서 해당하는 메서드를 추상 메서드로 처리하여 구현부를 없앨 수 있다. 구현부가 없어지고 원형(프로토타입)만 남게 됨.
// 기존 메서드
public void eat() {
	System.out.println("?");
}

// 추상 메서드
public abstract void eat();
  • 추상 클래스 (불완전한 객체) : 추상 메서드를 1개라도 갖고 있으면 해당 클래스는 추상 클래스가 됨.
public abstract class Animal {
	public abstract void eat();	// 추상 메서드
    
    public void move() {	// 구현 메서드
    	System.out.println("움직인다.");
    }
}
  • 추상 클래스는 불완전한 메서드를 갖고있는 불완전한 객체이므로 아래와 같이 객체 생성 불가. (부모 역할만 가능)
Animal ani = new Animal();	// 추상 클래스는 불가능.
  • 하위 클래스는 추상 메서드 반드시 재정의 : 부모(상위) 클래스가 추상 클래스가 되면, 자식(하위) 클래스는 반드시 추상 메서드를 구현해야 함(반드시 재정의 해야 함).
  • 추상 클래스는 서로 기능이 비슷한 클래스를 묶을 때 사용한다.

## 추상 클래스 (실습)

  • 기능이 비슷한 클래스는 추상 클래스로 묶음.
public abstract class Animal extends Object {	
	// 추상 클래스(불완전한 객체) -> Animal ani = new Animal(); 불가능.
	// 추상 클래스는 부모의 역할만 가능.
	
	public abstract void eat();		// 추상 메서드(불완전한 메서드)
	public void move() {
		System.out.println("무리를 지어서 이동합니다.");
	}
}
public class Cat extends Animal {
	// 이름, 나이, 종 등 : 상태정보 존재.
	
	@Override
	public void eat() { 
		System.out.println("고양이 처럼 먹는다."); 
	}
	
	
	public void night() {
		System.out.println("고양이는 밤에 눈에서 빛이 난다.");
	}
	
	public Cat() {
		super();	// new Animal();
	}
}
public class Dog extends Animal {
	// 이름, 나이, 종 등 : 상태정보 존재.
	
	// 재정의(override)	: 추상 메서드 재정의 하지 않는 경우 에러 발생.
	// 부모(Animal)이 추상 클래스 이므로 부모의 추상 메서드 재정의 필수.
	public void eat() { 
		System.out.println("멍멍이 처럼 먹는다."); 
	}	
	
	public Dog() {
		super();	// new Animal();
	}
}
public class TPC26 {
	public static void main(String[] args) {
		
		// Animal의 eat 메서드를 반드시 하위 클래스가 재정의(Override)
		Animal d = new Dog();
		d.eat();	// 재정의로 인해 Dog의 eat 출력.(다형성 보장됨)
		d.move();
		
		d = new Cat();
		d.eat();	// 재정의로 인해 Cat의 eat 출력.
		d.move();
		((Cat)d).night();	// DownCasting
	}
}

 

# 인터페이스 (100% 다형성 보장)

  • 키워드 : interface - implements (구현하다)
  • 인터페이스 : 서로 기능이 다른 클래스를 묶을 때 인터페이스를 사용한다. 100% 추상 메서드만 가능하며, 구현된 메서드를 가질 수 없다. 상위 클래스가 갖고 있는 메서드를 하위 클래스가 100% 재정의 해야 한다.
  • 하위 클래스의 동작 방식을 몰라도 인터페이스로 100% 동작시킬 수 있다.

## 인터페이스 (실습)

  • 인터페이스는 상수(final static) 사용 가능하다.
public interface RemoCon {	// 객체생성 불가. RemoCon con = new RemoCon(); 불가.
	
	// 상수(final static) 사용 가능.	
	int MAXCH =	 100;	// public static final int MAXCH = 100; 인데 생략되어 있음.
	int MINCH= 1;
	
	// 추상 메서드
	public void chUp();		// abstract 생략됨.
	public void chDown();
	public void internet();
}
public class TV implements RemoCon {

	@Override
	public void chUp() {
		System.out.println("채널이 올라감.");
	}

	@Override
	public void chDown() {
		System.out.println("채널이 내려감.");
	}

	@Override
	public void internet() {
		System.out.println("인터넷이 됨.");
	}
}
public class Radio implements RemoCon {

	@Override
	public void chUp() {
		System.out.println("채널이 올라감.");		
	}

	@Override
	public void chDown() {
		System.out.println("채널이 내려감.");
		
	}

	@Override
	public void internet() {
		System.out.println("인터넷이 됨.");		
	}
}

 

# 추상클래스와 인터페이스

  • 추상클래스와 인터페이스의 궁극적인 목적 : 다형성을 보장하기 위함.
  • 부모의 역할로 사용함.
  • 부모 클래스를 추상클래스 or 인터페이스로 만들어야 다형성을 보장할 수 있다. 
  • 하위(자식) 클래스에서 추상메서드는 반드시 재정의(Override) 해야 한다.
  추상 클래스 (불완전한 객체) 인터페이스 (불완전한 객체)
키워드 abstract interface
extends implements
공통점 다형성을 보장하기 위해 등장함.
객체를 생성할 수 없다. (new 불가)
하위(자식) 클래스에 의해 구현되어야 한다.
(재정의(Override) 필수)
부모(상위) 클래스의 역할로 사용한다.
(UpCasting으로 객체를 생성)
추상 메서드를 가진다.
차이점 서로 기능이 비슷한 클래스를 묶을때 사용.
구현 매서드 / 추상 메서드 함께 사용 가능.
구현 메서드를 가질 수 있다.
서로 기능이 다른 클래스를 묶을때 사용.
100% 추상 메서드로 이루어 진다.
구현 메서드를 가질 수 없다.
다중상속 형태를 지원 함.
final static(상수) 멤버 변수를 가질 수 있다.

## 추상 클래스와 인터페이스 (실습)

public interface RemoCon {	// 객체생성 불가. RemoCon con = new RemoCon(); 불가.
	
	// 상수(final static) 사용 가능.	
	int MAXCH =	 100;	// public static final int MAXCH = 100; 인데 생략되어 있음.
	int MINCH= 1;
	
	// 추상 메서드
	public void chUp();		// abstract 생략됨.
	public void chDown();
	public void internet();
}
public class TV implements RemoCon {

	int currCH = 70;
	
	@Override
	public void chUp() {
		if (currCH < RemoCon.MAXCH) {
			currCH++;
			System.out.println("채널이 올라감. 	{" + currCH + "}");
		} else {
			currCH = 1;
			System.out.println("채널이 올라감. 	{" + currCH + "}");
		}		
	}

	@Override
	public void chDown() {
		if (currCH > RemoCon.MINCH) {
			currCH--;
			System.out.println("채널이 내려감. 	{" + currCH + "}");
		} else {
			currCH = 100;
			System.out.println("채널이 내려감. 	{" + currCH + "}");
		}
		
	}

	@Override
	public void internet() {
		System.out.println("인터넷이 됨.");
	}
}
public class TPC28 {
	public static void main(String[] args) {
		RemoCon tv = new TV();
		for (int i = 0; i < 40; i++) {
			tv.chUp();
		}
		
		for (int i = 0; i < 40; i++) {
			tv.chDown();
		}
		
		tv.internet();
		
	}
}

 

# 인터페이스(규약)와 JDBC의 관계

## JAVA JDBC Programming

  • 자바에서 JDBC 프로그래밍을 하기위해 벤더에서 제공하는 클래스를 이용해야 한다. 벤더에서 제공하는 클래스가 통일되어 있지 않으면 자바 개발자들은 모든 데이터베이스의 동작을 알고 있어야 JDBC 프로그래밍이 가능해진다. (사실상 불가능) 
  • DB벤더(공급자) : 오라클, My-SQL, MS-SQL 등 존재
1. 오라클
class JavaOracle {
	// 접속동작
	oracleConnect(){
    }
}

2. My-SQL
class JavaMySql {
	// 접속동작
	mysqlConnect(){
    }
}


3. MS-SQL
class JavaMsSql {
	// 접속동작
	mssqlConnect(){
    }
}
  • 위와 같은 문제를 해결하기 위해 인터페이스 사용.
1. 상위클래스(부모) 에서 인터페이스 java.sql.* 생성.
public interface Connection {
	// 접속동작
    getConnection(String url, String user, String passwd);
}


2. 하위클래스(자식) 에서 구현클래스를 만들게 함. (Driver class)	
- 벤더에서 통일된 메서드 이름을 이용.
- Oracle Driver, MySQL Driver, MSSQL Driver

## 인터페이스와 JDBC의 관계 (실습)

public interface Dbconnect {
	public void getConnection(String url, String user, String passwd);
}
public class JavaOracle implements Dbconnect {

	@Override
	public void getConnection(String url, String user, String passwd) {
		System.out.println("오라클 DB가 접속 됩니다.");
	}	
}
public class JavaMySQL implements Dbconnect {

	@Override
	public void getConnection(String url, String user, String passwd) {
		System.out.println("MySQL DB가 접속 됩니다.");
		
	}
}
public class TPC29 {
	public static void main(String[] args) {
		// 드라이버 클래스 가상으로 만들어서 작업(실제 연결 X)
		// Oracle, MySQL, MSSQL 등 -> Driver class
		Dbconnect conn = new JavaOracle();
		conn.getConnection("url", "abc", "12345");
		
		conn = new JavaMySQL();
		conn.getConnection("url", "bbb", "12345");
	}
}

 

# 인터페이스의 상속관계

## 인터페이스와 인터페이스의 상속 관계

  • 인터페이스 간에 상속 가능.
1. 인터페이스 A
public interface A {
	public void m();
}


2. 인터페이스 A를 상속받은 인터페이스 B
public interface B extends A {
	public void z();
}


3. 인터페이스 B를 상속받은 클래스 X	-> 반드시 재정의(Override) 해야 함.
public class X implements B {
	public void m() {
    
	}
    
	public void z() {
    
	}
}


이때 객체 생성은 아래와 같이 진행.
B r = new X();
A r = new X();

## 다중상속 관계에 있는 클래스 구조

  • Animal (abstract class) / Pet (interface) / Robots (interface) 일때..
public class Dog extends Animal implements Pet, Robots {
	
}
반응형
반응형

# 다형성 활용

## 다형성 이론의 전제조건 (부모 클래스 활용)

  • 상속관계가 전제되어야 한다.
  • 객체 생성 시 UpCasting으로 하기. (상위 클래스가 하위 클래스에 메시지를 보내야 하니까)
UpCasting 이 되면 DownCasting 을 할수 있다.

// 자동 형 변환 (UpCasting)
// 방법1. Cat cat = new Cat();
// 방법2. Object ani = new Cat();
Animal ani = new Dog();	//방법3.
ani.eat();	// 컴파일시점에서 Animal의 eat() / 실행시점에서는 Dog의 eat()

//ani.night();	// Dog에는 없기때문에 불가능.
((Cat)ani).night();	// 강제 형 변환 (DownCasting)
  • 하위 클래스가 반드시 재정의(Override) 해야 한다. (다형성이 보장되기 위함)
  • 동적 바인딩을 통해 실현 됨. (동적 바이딩 : 실행 시점에서 사용될메서드가 결정되는 바인딩, 프로그램의 속도를 떨어뜨리는원인이 될 수 있다.)

## 다형성 활용 방법

매개변수를 부모(상위)클래스 타입으로 받게 되면 모든 자식(하위) 클래스를 받을 수 있음.

1. 다형성인수 (데이터 이동)

Dog d = new Dog();
display(d);

Cat c= new Cat();
display(c);


public static void display(Animal r) {	// 다형성인수 : Animal(상위클래스)의 모든 하위클래스를 받을 수 있다.
	r. eat();
}

2. 다형성 배열(서로 다른 객체를 담을 수 있다.)

Animal[] r = new Animal[2];	// 다형성배열 : 서로 다른 하위 클래스를 담을 수 있다.
r[0] = new Dpg();
r[1] = new Cat();

r[0].eat();
r[1].eat();

## 다형성 활용 (실습)

1. 다형성 인수 (실습)

public class TPC24 {
	public static void main(String[] args) {
		// 1. 다형성인수
		Dog dog = new Dog();
		display(dog);
		Cat cat = new Cat();
		display(cat);
	}

	/*
	 * // 메서드 오버로딩(Overloading) private static void display(Dog dog) { // TODO
	 * Auto-generated method stub
	 * 
	 * } private static void display(Cat cat) { // TODO Auto-generated method stub
	 * 
	 * }	
	 */
	// 부모타입을 받는 것으로 해결. (다형성인수)
	private static void display(Animal ani) {	// 다형성 인수 : Animal (이때 자동으로 UpCasting 됨)
		ani.eat();
		//ani.night();	// 없으므로 불가능.
		if (ani instanceof Cat) {	// instanceof : 타입 알아보는 것. ani가 Cat 타입으로부터 만들어졌으면 true 반환.
			((Cat)ani).night();	// DownCasting
		}		
	}
	
}

2. 다형성 배열

public class TPC25 {
	public static void main(String[] args) {
		// 2. 다형성 배열
		// Cat, Dog 타입 저장할 배열 생성.
		Animal[] ani = new Animal[2];
		ani[0] = new Cat();
		ani[1] = new Dog();
		
		// for문 이용.
		for (int i = 0; i < ani.length; i++) {
			ani[i].eat();
			
			if(ani[i] instanceof Cat) {
				((Cat)ani[i]).night();
			}
		}
		
		// 메서드 이용.
		display(ani);
		
	}

	private static void display(Animal[] ani) {	// 다형성 배열
		for (int i = 0; i < ani.length; i++) {
			ani[i].eat();
			
			if(ani[i] instanceof Cat) {
				((Cat)ani[i]).night();
			}
		}
	}
}
반응형
반응형

# 부모 자식간 형 변환

## 객체 형 변환 (Object Casing)

  • 상속관계에 있는 클래스들 간의 형 (Data Type)을 바꾸는 것.
  • 자동 형 변환 (UpCasting)
부모 = 자식.

Animal r = new Dog();
r = new Cat();
  • 강제 형 변환 (DownCasting)
자동 형 변환(UpCasting)이 전재되면, 강제 형 변환가능.
Animal r = new Cat();	

((Cat)c).night();

## 객체 형 변환 (실습)

public class TPC23 {
	public static void main(String[] args) {
		// 자동 형 변환 (UpCasting)
		// 방법1. Cat cat = new Cat();
		// 방법2. Object ani = new Cat();
		Animal ani = new Dog();	//방법3.
		ani.eat();	// 컴파일시점에서 Animal의 eat() / 실행시점에서는 Dog의 eat()
		
		//ani.night();	// Dog에는 없기때문에 불가능.
		((Cat)ani).night();	// 강제 형 변환 (DownCasting)		
		// 다형성 : 상위 클래스가 하위 클래스에게 동일한 메시지로 서로 다르게 동작시키는 객체지향의 원리.
	}	
}

 

# 다형성

## message polymorphism (다형성) -> 객체 지향 이론의 꽃

  • 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위클래스들을 서로 다르게 동작시키는 객체지향 원리
상위 클래스 Animal
하위 클래스 Cat, Dog

=>
상위 클래스인 Animal 이 하위 클래스인 Cat, Dog에게 동일한 메시지(eat)를 보내면,
하위 클래스인 Cat, Dog의 eat 메서드가 서로 다르게 동작하는 것.
  • 재정의 (Override) 가 전제 되어야 다형성 이론 설명 가능.
Animal d = new Dog();
d.eat();

d = new Cat();
d.eat();
  • 강제 형 변환 (DownCasting)을 통해 하위클래스의 night 메서드에 접근 가능.
Animal ani = new Cat();
ani.night();	// 불가능.

((Cat)ani).night();
반응형

+ Recent posts