본문 바로가기
Java

자바 객체 지향 프로그래밍 OOP (Java Object Oriented Programming)

by wanttosleep1111 2023. 1. 31.

자바 객체 지향 프로그래밍 OOP (Java Object Oriented Programming)

 

1. 패러다임(paradigm) : 사람들의 견해나 사고를 근본적으로 규정하는 테두리

 

※프로그래밍에서 패러다임

 

① 절차지향 (C언어 등)

  • 개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결
    ex) 자동차 제조 : 엔진, 차체, 핸들, 바퀴, 의자 순서로 차례를 지켜 만들어져야 함.
  • 컴퓨터의 처리 구조와 유사, 실행 속도가 빠름
  • 모든 구성 요소가 연결되어 유지 보수가 어려움
  • 실행 순서가 정해져 있어서 코드 순서가 바뀌면 결과가 달라질 수 있음

 

② 객체지향 (C++, Java, Python 등)

  • 객체 : 여러가지 데이터들이 모여있는 복잡한 자료형
  • 클래스와 객체
    class : 실제 Object를 제작하기 전 설계하는 도면
    object : 클래스를 기반으로 실제 메모리에 할당되는 것

 

  • 프로그램을 다수의 객체로 만들어 이들끼리 서로 상호작용하도록 만듦
    어떤 값이 들어가냐에 따라 서로 다른 값을 가진 객체를 생성
    ex) 사람의 모든 속성을 적절히 정의, 연결하여 사람이라는 객체를 만들기

 

  • 신뢰성 있는 소프트웨어를 쉽게 작성하고, 코드 재사용, 유지 보수가 쉽다.
  • 직관적 코드 분석이 가능하고, 소프트웨어 생산성이 향상된다.

 


 

2. 객체지향 프로그래밍의 특징

 

① 추상화 (Abstraction)

  • 객체에서 공통된 속성과 행위를 추출하는 기법
  • 상세한 정보는 무시하고 필요한 정보들만 간추려서 구성
  • 코드 상에서 구현(로직)부분은 제외하고, 오직 선언 부분만을 설계

 

② 캡슐화 (Encapsulation)

  • 관련된 속성(필드)와 기능(메소드)을 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 기법(정보은닉)
  • 만일의 상황(타인이 외부 조작)을 대비하여, 특정 필드나 메소드를 사용자가 조작할 수 없도록 숨김
  • 외부에서는 공개된 메소드의 인터페이스를 통해 접근 가능

 

③ 상속 (Inheritance)

  • 이미 작성된 클래스(상위)의 특성을 그대로 이어받아 새로운 클래스(하위)를 생성하는 기법
  • 기존 코드를 그대로 재사용하거나 재정의 : 재사용 + 확장

 

④ 다형성 (Polymorphism)

  • 같은 메소드(기능)를 호출하더라도 객체에 따라 다르게 동작하는 것
  • 상위 클래스의 동작을 하위 클래스에서 다시 정의하여 사용하는 것 또한 다형성으로 볼 수 있음

 


 

3. 객체 생성

 

① 생성자 메소드

  • 기본 생성자는 자동으로 생성되며, 생략이 가능 (단, 개발자가 새로운 생성자를 선언 시 기본 생성자는 사라짐)
  • 생성자는 하나 이상 선언되어야 하며, 생성자도 메소드이므로 오버로딩 가능
  • 생성자 이름은 클래스 이름과 동일
  • 생성자는 리턴 타입을 지정 불가능
  • 생성자는 new를 통해 객체를 생성할 때 호출

② getter,setter 메소드

  • getter 메소드 : 필드 값을 가져갈 수 있는 메소드
  • setter 메소드 : 필드에 새로운 값을 넣을 수 있는 메소드
  • Alt+Shift+S → R 을 사용해 빠르게 생성 가능

 

 

▶ 연습

package OOP;

public class Person {
	
	// 속성(필드) 정의
	String name;
	int age;
	
	// 생성자 메소드
	public Person() {
		
	}
	
	// 생성자 메소드 오버로딩
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// getter,setter 메소드
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	// 기능 메소드 만들어보기
	public void eat() {
		System.out.println("먹기");
	}
	
	public String tell() {
		return "말하다";
	}
	
	
}

 

package OOP;

public class PersonMain {

	public static void main(String[] args) {

		// 객체 생성
		Person p1 = new Person("유재석", 50);
		// get메소드 사용해보기
		System.out.println(p1.getAge());
		// set메소드 사용해 나이를 바꾸고 다시 get메소드 사용해보기
		p1.setAge(52);
		System.out.println(p1.getAge());
		// eat(),tell() 사용해보기
		p1.eat();
		System.out.println(p1.tell());
	
	}

}

 


 

▶ 예제

통장관리 프로그램

 

package Bankbook;

public class Bankbook {

	
	int money;

	public void deposit(int num) {
		money += num;
	}

	public void withdraw(int num) {
		money -= num;
	}
	
	public int showMoney() {
		return money;
	}
}

 

package Bankbook;

import java.util.Scanner;

public class BankbookMain {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		Bankbook b = new Bankbook();
		
		// 금액 입금
		System.out.print("입금할 금액 입력 >> " );
		int num1 = sc.nextInt();
		b.deposit(num1);
		// 통장 잔액 출력
		System.out.println("현재 잔액 : "+b.showMoney()+"원");
		// 금액 출금
		System.out.print("출금할 금액 입력 >> ");
		int num2 = sc.nextInt();
		b.withdraw(num2);
		System.out.println("현재 잔액 : "+b.showMoney()+"원");
	}

}

 


 

▶ 예제

학생 성적 관리 프로그램

package Student;

public class Student {

	String name;
	int number;
	int age;
	int scoreJava;
	int ScoreWeb;
	int scoreAndroid;

	public Student(String name, int number, int age, int scoreJava, int scoreWeb, int scoreAndroid) {
		this.name = name;
		this.number = number;
		this.age = age;
		this.scoreJava = scoreJava;
		this.ScoreWeb = scoreWeb;
		this.scoreAndroid = scoreAndroid;
	}
	
}

 

package Student;

public class StudentMain {

	public static void main(String[] args) {

		
		Student stu1 = new Student("유재석", 20220878, 20, 50, 99, 77);		
		Student stu2 = new Student("박명수", 20220458, 20, 90, 25, 50);		
	}

}

 


 

▶ 예제

포켓몬 게임

1. 두 마리의 포켓몬 생성

2. 사용자로부터 포켓몬 선택

3. 공격 혹은 스킬 공격 둘 중 하나를 선택

4. 선택한 포켓몬이 다른 포켓몬을 공격 (공격 시 포켓몬 hp - 공격력, 스킬 공격시 공격력은 2배 증가)

6. 한 마리의 포켓몬이 죽을 때까지 게임 반복

package pocket;

public class pocket {
	
	String name;
	int hp;
	int atk;
	
	public pocket(String name, int hp, int atk) {
		this.name = name;
		this.hp = hp;
		this.atk = atk;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getHp() {
		return hp;
	}

	public void setHp(int hp) {
		this.hp = hp;
	}

	public int getAtk() {
		return atk;
	}

	public void setAtk(int atk) {
		this.atk = atk;
	}
	
	public int skill() {
		int skill = getAtk() * 2;
		return skill;
	}
}

 

package pocket;

import java.util.Scanner;

public class pocketMain {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		pocket kkobugi = new pocket("꼬부기", 100, 20);
		pocket pyree = new pocket("파이리", 110, 15);
		
		do {

			System.out.print("공격할 포켓몬을 선택하세요");
			System.out.print(" [1]꼬부기 [2]파이리  >> ");
			int choice = sc.nextInt();
			System.out.print("[1]일반 공격 [2]스킬 공격 >> ");
			int atkChoice = sc.nextInt();
			
			if (choice == 1) {
				if (atkChoice == 1) {
					pyree.setHp(pyree.getHp() - kkobugi.getAtk());
					System.out.println("파이리의 남은 체력 : "+pyree.getHp());
				} else {
					pyree.setHp(pyree.getHp() - kkobugi.skill());
					System.out.println("파이리의 남은 체력 : "+pyree.getHp());
				}
			} else {
				if (atkChoice == 1) {
					kkobugi.setHp(kkobugi.getHp() - pyree.getAtk());
					System.out.println("꼬부기의 남은 체력 : "+kkobugi.getHp());
				} else {
					kkobugi.setHp(kkobugi.getHp() - pyree.skill());
					System.out.println("꼬부기의 남은 체력 : "+kkobugi.getHp());
				}
				
			}
			
			if (pyree.getHp() < 0) {
				System.out.println("파이리가 탈진했습니다.");
			} else if (kkobugi.getHp() < 0) {
				System.out.println("꼬부기가 탈진했습니다.");
			}
		} while ((kkobugi.getHp() > 0) && (pyree.getHp() > 0));
			
		
	}

}

'Java' 카테고리의 다른 글

자바 상속 (Java Inheritance)  (0) 2023.03.05
자바 ArrayList (Java ArrayList)  (0) 2023.03.04
자바 메소드(Java Method)  (0) 2023.01.28
자바 이차원 배열(Java Two-dimensional array)  (0) 2023.01.22
자바 배열 (Java Array)  (0) 2023.01.17

댓글