Java

객체지향 패러다임

햄발자 2024. 4. 16. 12:26

객체지향

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

 

객체지향 패러다임

객체지향 패러다임(Object-Oriented Paradigm)은 소프트웨어를 설계하고 구현하는 방법론 중 하나로, 실세계의 객체를 모델링하여 소프트웨어의 복잡성을 관리하고 코드의 재사용성을 높이는 데 중점을 둔다.

 

이 패러다임의 핵심은 프로그램을 상호작용하는 객체들의 집합으로 보고, 각 객체는 자신의 데이터와 행위를 갖는 독립적인 엔티티로 취급하는 것이다.

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

 

 

 

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

 

캡슐화(Encapsulation)

객체는 데이터(변수)와 그 데이터를 조작하는 함수(메서드)를 하나로 묶습니다. 이를 통해 데이터 구조와 데이터를 조작하는 방법을 결합하여 데이터의 추상화를 가능하게 하고, 외부에서의 직접적인 접근을 제한합니다.

 

상속(Inheritance)

하나의 클래스가 다른 클래스의 특성을 물려받을 수 있는 메커니즘으로, 코드의 재사용성을 높이고, 중복을 줄이며, 유지 보수를 쉽게 합니다.

 

다형성(Polymorphism)

하나의 메서드나 클래스가 다양한 방식으로 동작하는 능력을 말합니다. 오버라이딩(Overriding)과 오버로딩(Overloading)은 다형성을 구현하는 일반적인 방법입니다.

 

추상화(Abstraction)

복잡한 현실의 개체를 단순화된 모델로 표현하는 것으로, 핵심적인 개념 또는 기능에만 집중하여 프로그램의 복잡성을 줄입니다.

 

 

예시

package basic.ch09;

public class Bus {

int busNumber; 
int passengerCount; // 승객 수 
int money; // 수익금 

// 강제성
public Bus(int number) {
// 객체 생성시에 제일 먼저 실행 되는 부분 
busNumber = number;
}

// 승객을 태운다. 
public void take(int pay) {
//money = money + pay;
money += pay;
//passengerCount = passengerCount + 1;
passengerCount++;
}

// 현재 상황을 보여주는 기능을 만들어 보자. 
public void showInfo() {
System.out.println("버스 번호 : " + busNumber);
System.out.println("버스 승객수 : " + passengerCount);
System.out.println("버스 수익금 : " + money);
}


}

 

예시

package basic.ch09;

public class Subway {

int lineNumber; 
int passengerCount; 
int money; 

public Subway(int line) {
lineNumber = line;
}

// 지하철도 승객을 태우다. 
public void take(int pay) {
money += pay;
passengerCount++;
}

// 현재 상황을 보여주는 기능을 만들어 보자. 
public void showInfo() {
System.out.println("지하철 번호 : " + lineNumber);
System.out.println("지하철 승객수 : " + passengerCount);
System.out.println("지하철 수익금 : " + money);
}


}

 

예시

package basic.ch009;

public class Student {

String name;
int money; // 소지금

public Student(String myName, int myMoney) {
name = myName;
money = myMoney;
}

// 학생이 버스를 탄다.
public void takeBus(Bus bus) {
// 어떻게 코드를 만들어야 할까?
bus.take(1500);
money = money - 1500;
}

// 학생이 지하철을 탄다.

// 상태창을 보여 준다.
public void showInfo() {
System.out.println("학생 이름 : " + name);
System.out.println("학생 소지금 : " + money);
}

}

 

실행흐름 만들기 예시

package basic.ch09;

import java.util.Scanner;

public class GoingToSchool2 {

public static void main(String[] args) {
boolean flag = true;

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

// 스캐너를 활용해서 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("베인", 80_000);

Scanner scan = new Scanner(System.in);

while (flag) {

System.out.print("버스타기 1번 지하철타기 2번 : ");
int ride = scan.nextInt();

if (ride == 1) {
System.out.println("버스를 선택하였습니다");
System.out.println("몇번 버스를 타시겠습니까?");
System.out.println("100번 / 200번");

s1.takeBus(bus1);
s1.showInfo();
System.out.println("----------------");
bus1.showInfo();
bus1.take(1500);
System.out.println("----------------");
} else if (ride == 2) {
System.out.println("지하철을 선택하였습니다");
s1.takeSubway(subway2);
s1.showInfo();
System.out.println("-----------------");
subway1.take(ride);
subway1.showInfo();

}

// end of while
}
} // end of mai

} // end of class

 

클래스 설계 부터 실행 흐름

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

전사, 마법사, 궁수
예시
package basic.ch09;

public class Warrior {

String name; 
int power; 
int hp; 

// 생성자 
public Warrior(String myName, int myPower) {
name = myName;
power = myPower;
hp = 100; 
}

// Warrior 공격을 하다 

// Wizard 공격을 하다
public void attackWizard(Wizard wizard) {
System.out.println("마법사를 공력(" + this.power + ") 합니다");
wizard.beAttacked(this.power); // 호출 
}

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

 

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.out.println("이미 죽었습니다.");
return; // 실행에 흐름을 반환 
}
hp = hp - power;
}
}

 

package basic.ch09;

import java.util.Scanner;

public class MainTest {

// 코드의 시작점 --> 실행에 흐름을 만들 수 있다. 
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("전사가 마법사을 몇번 공격하시겠습니다. ");
Scanner sc = new Scanner(System.in); 
int inputData = sc.nextInt();
for(int i = 0; i < inputData; i++) {
warrior1.attackWizard(wizard1);
}

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

} // end of main 

} // end of class