자바 객체 지향 프로그래밍 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 |
댓글