Java

2024.04.16 객체지향 패러다임이란

정훈5 2024. 4. 16. 13:52
학습 목표 

1. 객체지향 패러다임이란 뭘까? 
2. 객체와 객체간에 상호작용 만들어 보기

 

1. 객체지향 패러다임이란 뭘까?

객체지향 패러다임(Object-Oriented Paradigm)은 소프트웨어를 설계하고 구현하는 방법론 중 하나로,

실세계의 객체를 모델링하여 소프트웨어의 복잡성을 관리하고 코드의 재사용성을 높이는 데 중점을 둡니다.

이 패러다임의 핵심은 프로그램을 상호작용하는 객체들의 집합으로 보고,

각 객체는 자신의 데이터와 행위를 갖는 독립적인 엔티티로 취급하는 것입니다.

 "엔티티(Entity)"는 특정 속성과 행동을 가진 독립적인 단위 또는 객체를 의미합니다.

 

객체지향 패러다임의 주요 원칙

  1. 캡슐화(Encapsulation): 객체는 데이터(변수)와 그 데이터를 조작하는 함수(메서드)를 하나로 묶습니다. 이를 통해 데이터 구조와 데이터를 조작하는 방법을 결합하여 데이터의 추상화를 가능하게 하고, 외부에서의 직접적인 접근을 제한합니다.
  2. 상속(Inheritance): 하나의 클래스가 다른 클래스의 특성을 물려받을 수 있는 메커니즘으로, 코드의 재사용성을 높이고, 중복을 줄이며, 유지 보수를 쉽게 합니다.
  3. 다형성(Polymorphism): 하나의 메서드나 클래스가 다양한 방식으로 동작하는 능력을 말합니다. 오버라이딩(Overriding)과 오버로딩(Overloading)은 다형성을 구현하는 일반적인 방법입니다.
  4. 추상화(Abstraction): 복잡한 현실의 개체를 단순화된 모델로 표현하는 것으로, 핵심적인 개념 또는 기능에만 집중하여 프로그램의 복잡성을 줄입니다.

지금 단계에서는 객체지향 프로그래밍이란 이렇게 기억해 봅시다. <중요>

객체지향이란 객체와 객체간에 관계를 형성하고 상호작용하게 코드를 작성하는 것

 

 

package basic.ch09;

public class Bus {
	
	int busNumber; // 버스 번호 // 기본값 : 0
	int passengerCount; // 승객 수 // 기본값 : 0
	int money; // 버스 수익 // 기본값 : 0
	
	// 강제성 부여
	
	// 강제성 부여 (생성자 만들기)
	
	public Bus(int number) {
		// 객체 생성 시 제일 먼저 실행되는 부분
		busNumber = number;
	}
	
	// 승객을 태운다. (기능) (함수 만들기)
	
	public void take(int pay) {
		// money = money + pay;
		money += pay; // 복합 대입 연산자 사용 하던가, 연산자 사용 하던가
		
		// passengerCount = passengerCount + 1;
		passengerCount++; // 증감 연산자	
		
	} // end of take()
	
	
	// 현재 상황을 보여주는 기능을 만들어 보자
	
	public void showInfo() {
		System.out.println("버스 번호 : " + busNumber);
		System.out.println("버스 승객 수 : " + passengerCount);
		System.out.println("버스 수익금 : " + money);
	} // end of showInfo();

}

 

package basic.ch09;

public class Subway {

	int lineNumber;
	int passengerCount;
	int money;

	// 생성자
	public Subway(int line) {
		lineNumber = line;
	} // end of Subway()

	// 지하철도 승객을 태우다. (리턴없는 함수)
	public void take(int pay) {
		money += pay;
		passengerCount++;
	} // end of take()

	public void showInfo() { // (리턴없는 함수)
		System.out.println("지하철 번호 : " + lineNumber);
		System.out.println("지하철 승객 수 : " + passengerCount);
		System.out.println("지하철 수익금 : " + money);
	} // end of showInfo();

}

 

package basic.ch09;

public class GoingToSchool {
	// Code Start
	public static void main(String[] args) {
		
		// 객체지향 프로그램이란 객체와 객체간의 관계를 형성하고
		// 상호 작용하게 프로그래밍 하는 것
		
		Bus bus1 = new Bus(100);
		Bus bus2 = new Bus(200);
		Subway subway1 = new Subway(1);
		Subway subway2 = new Subway(2);
		Subway subway3 = new Subway(3);
		
		// 집중 !
		// "학생이 버스를 탄다" 라는 것을 만든다.
		
		Student student1 = new Student("홍길동", 10_000);
		student1.showInfo();
		// 학생이 버스를 탄다.
		System.out.println("-----------------");
		student1.takeBus(bus2);
		student1.showInfo();
		
		// 버스의 상태값을 확인해 보자.
		System.out.println("-----------------");
		bus2.showInfo();
		System.out.println("-----------------");
		
		student1.takeSubway(subway1);
		student1.showInfo();
		subway1.showInfo();
		System.out.println("-----------------");
		subway2.showInfo();
		
	} // end of main

} // end of class

 

연습문제

		// 설계된 클래스(Bus, Student, Subway)를 가지고
		// 본인이 의도한 대로 실행에 흐름을 만들어 보자.

		// 스캐너를 활용해서
		// 사용자가 1번을 누르면 버스를 태워서 실행의 흐름을 만들고
		// 사용자가 2번을 누르면 지하철을 태우는 실행의 흐름을 만들어 보자.

		Bus bus1 = new Bus(100);
		Bus bus2 = new Bus(200);

		Subway subway1 = new Subway(1);
		Subway subway2 = new Subway(2);

		Student s1 = new Student("티모", 100_000);
		Student s2 = new Student("야스오", 100_000);

 

클래스 설계 부터 실행 흐름

  • 객체와 객체간에 상호작용할 수 있도록 코드를 설계하고 실행에 흐름을 만든다.

전사, 마법사 

package basic.ch09;

public class Warrior {
	
	String name;
	int power;
	int hp;
	
	// 생성자
	public Warrior(String Myname, int MyPower) {
		name = Myname;
		power = MyPower;
		hp = 100;
	}
	
	// Wizard 공격을 하다.
	public void attackWizard(Wizard wizard) {
		// Wizard wizard : 상호작용 하게끔 설계
		System.out.println("마법사를 공격(" + this.power + ")합니다.");
		wizard.beAttacked(this.power); // 호출 
	}

	// 내가 공격을 받다.
	public void beAttacked(int power) {
		// 방어적 코드 작성
		if(hp <= 0) {
			System.err.println("이미 죽었습니다.");
			return; // 실행에 흐름을 반환
		}
		hp = hp - power;
	} // end of beAttacked
	
}

 

package basic.ch09;

public class Wizard {

	String name;
	int power;
	int hp;
	
	public Wizard(String myName, int myPower) { // 생성자 함수
		this.name = myName;
		this.power = myPower;
		hp = 50;
	}

	// 전사를 공격하다.
	public void attackWarrior(Warrior warrior) {
		warrior.beAttacked(this.power); // (전사)가 공격을 받다.
	}

	// 내가 공격을 받다.
	public void beAttacked(int power) {
		// 방어적 코드 작성
		if (hp <= 0) {
			System.err.println("이미 죽었습니다.");
			return; // 실행에 흐름을 반환
		}
		hp = hp - power;
	} // end of beAttacked

}

 

package basic.ch09;

import java.util.Scanner;

public class MainTest {
	// Code Start --> 실행에 흐름을 만들 수 있다.
	public static void main(String[] args) {

		Warrior warrior1 = new Warrior("작은오크", 10); // 인스턴스 생성
		Warrior warrior2 = new Warrior("큰오크", 30); // 인스턴스 생성

		Wizard wizard1 = new Wizard("7급 마법사", 20); // 클래스 인스턴스 생성

//		System.out.println("전사가 마법사를 5번 공격합니다.");
		System.out.println("전사가 마법사를 몇번 공격하시겠습니까?");
		Scanner sc = new Scanner(System.in);
		int inputData = sc.nextInt();
		for (int i = 0; i < inputData; i++) {
			warrior1.attackWizard(wizard1);
		}

		System.out.println("마법사 HP 확인 : " + wizard1.hp);

	} // end of main

} // end of class