백엔드/Java

객체지향 프로그래밍

짱뚱짱 2024. 10. 14. 13:03

 

📢 객체지향 프로그래밍의 4가지 주요 특징

- 정보 처리 시험에 많이 나온다. (영어로도)

추상화 (Abstraction)

핵심적인 부분만 보여줌으로써 복잡성을 줄임.

구현된 부분과 구현되지 않은 부분을 분리.

자식 클래스에서 구현해야 할 부분을 정의.

 

캡슐화 (Encapsulation)

데이터 보호를 위해 정보 은닉을 실현.

멤버 변수를 private으로 숨기고 메서드를 통해 접근.

데이터와 메서드를 하나의 단위로 묶어 관리.

 

상속 (Inheritance)

코드 재사용 및 확장을 용이하게 함.

기존 클래스를 상속받아 수정함으로써 중복 코드를 줄이고 유지보수를 쉽게 함.

 

다형성 (Polymorphism)

동일한 코드가 여러 객체 형태로 실행될 수 있도록 함.

입력 객체에 따라 다른 결과를 생성하여 유연성과 확장성을 제공.

유지보수가 편리한 구조를 지원.

 

📢 실습

객체지향 프로그래밍의 특징을 이해하기 위해 클래스 생성하여 실습

package day06;

class Animal{
	//공통적인 속성
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}

class Human extends Animal{

	@Override
	public void move() {
		System.out.println("사람은 두발로 걷습니다.");
	}
	public void readBook() {
		System.out.println("사람이 책을 읽습니다.");
	}
	
}

class Tiger extends Animal{
	@Override
	public void move() {
		System.out.println("호랑이가 네발로 어슬렁거립니다.");
	}
	public void hunting() {
		System.out.println("호랑이가 사냥을 합니다.");
	}
}

class Eagle extends Animal{
	@Override
	public void move() {
		System.out.println("독수리가 하늘을 날아다닙니다.");
	}
	public void flying() {
		System.out.println("독수리가 날카로운 눈으로 날아다니며 사냥합니다.");
	}
}

class Dog{
	public void move() {
		System.out.println("강아지가 아장아장 걷습니다.");
	}
}

public class Polymorphism01 {

	public static void main(String[] args) {
		// Human, Tiger, Eagle 객체 생성
		Human human = new Human();
		human.move();
		human.readBook();
		System.out.println("------------------");
		Tiger tiger = new Tiger();
		tiger.move();
		tiger.hunting();
		System.out.println("------------------");
		Eagle eagle = new Eagle();
		eagle.move();
		eagle.flying();

		System.out.println("--조상의 객체로 자식의 객체를 생성--");
		//자색객체로 부모객체의 생성은 불가능
//		Human h = new Animal(); 	//불가능
		
		// 조상의 클래스로 자식의 객체를 생성 가능.
		// but, 조상에게 상속받은 메서드만 실행 가능. 내가 개인적으로 만든건 못쓴다.
		Animal hAnimal = new Human();
		hAnimal.move();
//		hAnimal.readBook();	// 사용 불가능.
		Animal tAnimal = new Tiger();
		tAnimal.move();
		Animal eAnimal = new Eagle();
		eAnimal.move();
		
		System.out.println();
		System.out.println("--다형성 메서드 예시--");
		Polymorphism01 ex01 = new Polymorphism01();
		// 부모의 객체로 생성이 되었기 때문에 당연히 가능.
		ex01.moveAnimal(eAnimal);
		ex01.moveAnimal(tAnimal);
		ex01.moveAnimal(hAnimal);
		// 자신의 객체로 생성되었다 하더라도 자동 형변환이 이루어져 출력가능.
		ex01.moveAnimal(eagle);
		ex01.moveAnimal(tiger);
		ex01.moveAnimal(human);
		
		Dog dog = new Dog();
//		ex01.moveAnimal(dog);	//animal 클래스를 상속받고 있지 않기 때문에 불가능.
		System.out.println();
		System.out.println("--Anymal 배열 생성 예시--");
		int cnt=0;
		Animal[] aniList = new Animal[5];
		
		aniList[cnt] = hAnimal;
		cnt++;
		aniList[cnt] = tAnimal;
		cnt++;
		aniList[cnt] = eAnimal;
		cnt++;
		
		for(int i=0; i<cnt; i++) {
			aniList[i].move();
		}
		
		System.out.println();
		System.out.println("--다운 케스팅 예시--");
		// Human클래스 객체에 Animal을 상속받은 Human 클래스 객체를 다운 케스팅한 예시
		Human h = (Human)hAnimal;
		h.readBook();
		
//		Human h1 = (Human)tAnimal;
//		h1.readBook();	//casting 오류
		//instanceof 연산자로 확인하여 실행
		
		System.out.println("--instanceof 연산자--");
		//instanceof : 객체가 해당 클래스의 형이 맞는지 확인
		System.out.println(tAnimal instanceof Human);
		System.out.println(tAnimal instanceof Tiger);
		System.out.println(tAnimal instanceof Eagle);
		
		Animal downCastingTest = eAnimal;
		if(downCastingTest instanceof Human) {
//			((Human) downCastingTest).readBook();
			Human testHuman = (Human)downCastingTest;
			testHuman.readBook();
		}else if(downCastingTest instanceof Tiger){
			((Tiger) downCastingTest).hunting();
		}else if(downCastingTest instanceof Eagle) {
			((Eagle) downCastingTest).flying();
		}else {
			System.out.println("error");
		}
		
		
	}
	
	// 다형성 예시 메서드 (업케스팅:자동형변환 가능)
	public void moveAnimal(Animal animal) {
		animal.move();
		if(animal instanceof Human) {
			((Human)animal).readBook();
		}else if(animal instanceof Tiger) {
			((Tiger)animal).hunting();
		}else if(animal instanceof Eagle) {
			((Eagle)animal).flying();
		}else {
			System.out.println("error");
		}
	}

}

 

 

 

결과

사람은 두발로 걷습니다.
사람이 책을 읽습니다.
------------------
호랑이가 네발로 어슬렁거립니다.
호랑이가 사냥을 합니다.
------------------
독수리가 하늘을 날아다닙니다.
독수리가 날카로운 눈으로 날아다니며 사냥합니다.
--조상의 객체로 자식의 객체를 생성--
사람은 두발로 걷습니다.
호랑이가 네발로 어슬렁거립니다.
독수리가 하늘을 날아다닙니다.

--다형성 메서드 예시--
독수리가 하늘을 날아다닙니다.
독수리가 날카로운 눈으로 날아다니며 사냥합니다.
호랑이가 네발로 어슬렁거립니다.
호랑이가 사냥을 합니다.
사람은 두발로 걷습니다.
사람이 책을 읽습니다.
독수리가 하늘을 날아다닙니다.
독수리가 날카로운 눈으로 날아다니며 사냥합니다.
호랑이가 네발로 어슬렁거립니다.
호랑이가 사냥을 합니다.
사람은 두발로 걷습니다.
사람이 책을 읽습니다.

--Anymal 배열 생성 예시--
사람은 두발로 걷습니다.
호랑이가 네발로 어슬렁거립니다.
독수리가 하늘을 날아다닙니다.

--다운 케스팅 예시--
사람이 책을 읽습니다.
--instanceof 연산자--
false
true
false
독수리가 날카로운 눈으로 날아다니며 사냥합니다.

 

'백엔드 > Java' 카테고리의 다른 글

Java 날짜와 시간  (0) 2024.10.16
Java로 고객 관리 시스템 구현  (2) 2024.10.15
Java로 학생 정보 관리 시스템 구현(3)  (0) 2024.10.13
Java로 로또 추첨기 만들기  (1) 2024.10.12
Java 인터페이스  (0) 2024.10.11