728x90

객체지향 프로그래밍

1. 프로그램을 기능별로 나눠서 코드를 구성하는 기법.

* 절차지향 프로그래밍(C언어, fortran, COVOL)

- 위에서 아래로 코드를 구성하는 기법.

 

* 클래스/ 오브젝트(객체)

 

- 클래스 : 객체를 만들기 위한 설계도.

- 객체 : 설계도로 만들어진 결과물(실체)

 

클래스 두 구성요소

- 필드: 객체가 가질수 있는 속성(정의) : 나이, 키, 몸무게, 성별

- 메소드 : 객체가 가질수 있는 기능(행동) : 먹다, 자다, 싸우다, 울다

 

프로그래밍 패러다임

절차적 프로그래밍

하나의 프로그램에 대한 코드들을 순서대로 코드를 진행했다

하나에 모든것을 작성하기 떄문에 일부분이 오류나면 전체가 오류난다.

그래서 객체지향프로그래밍을 사용하기 시작한다.

 

클래스가 분리되어 있어 한부분만 오류나도 그기능을 제외한 나머지 기능들은 정상작동 할 수있다.

* 단점

- 메모리가 많이 차지

- 데이터 주고받는 시간이 생긴다.

객체지향의 예시

- 고장난 부분만 교체할수 있기 때문에 유지보수가 용이하다

알고 가야할 두 단어!

1) class : '객체를 정의 해 놓은 것' 또는 클래스는 '객체의 설계도 또는 틀' 이라고 정의 (붕어빵 틀)

2) object : 실제로 존재하는 것(틀안에 있는 붕어빵)

 

클래스의 구조

필드(변수) -> 특성이 들어가야함

메소드(행위,기능,로직) -> 기능들을 들어가야 하는 것(객체의 행위)

 

클래스 구조의 예
고양이의 설계도
객체지향의 특징 4가지 (캡.상.추.다)

1.추상화(abstract)

- 객체에서 공통된 속성과 행위를 추출하는 기법

- 코드 상에서 구현(로직)부분을 제외한 오직 선언 부분만을 설계

- 상세한 정보는 무시하고 필요한 정보들만 간추려서 구성

2. 상속(ingerifance)

-  대상이 되는 클래스의 모든 특징들을 물려 받는 것

3. 다형성

4. 캡슐화

- 정보은닉

- 타인이 외부에서 조작을 대비해서 사용자가 조작할 수 없도록 숨겨 놓은것

- 외부에서는 공개된 메소드의 인터페이스를 통해 접근 할 수 있다

 

예시

person설계도

package person;

public class Person {
	
	// 클래스 == 설계도면 == 객체를 생성하기 전 우리가 직접 설계하는 도면
	// 사람을 설계하는 클래스
	
	// 1. 필드(field) : 데이터, 변수, 속성
	int age; // 사람의 나이
	String gender; // 사람의 성별
	String name; // 사람의 이름
	String bloodType; // 사람의 혈액형
	
	// 생성자 특징
	// 1. 생성자도 메서드다
	// 2. 생성자는 리턴 타입이 없다( 존재하지 않음 void (X))
	// 3. 기본 생성자는 생략되어있다
	// 4. 기본생성자 기능을 부여할 수 있다.
	// 5. 생성자의 이름은 클래스명과 동일하다.
	
	
	public Person(int age, String gender, String name, String bloodType) {
		// 현재 클래스를 지칭 : this
		this.age = age;
		this.gender = gender;
		this.name = name;
		this.bloodType = bloodType;
	}
	
	public Person() {
		// 기본 생성자
		// 메서드를 중복 정의 : 오버로딩
		// 오버로딩 : 메서드 이름은 같다
		// 하지만 사용하는 매개변수의 개수와 타입은 달라야 한다.
		
	}
	// 6. 기능을 가진 생성자를 만들면
	// 생략되어 있는 기본생성자는 덮어 씌워진다
	// 만약에 기본 생성자 사용하고 싶다면
	// 눈에 보이도록 코드로 작성하자
	// 메서드 특징 오버로딩(중복정의)
	// 메서드 이름 리턴타입은 같지만
	// 메서드에서 사용되는 변수(매개변수)는
	// 개수, 타입이 다르게 선언되어있는걸 보고
	// 오버로딩이라고 한다.
	
	
	// 2. 메서드(method) : 기능, 행위, 로직
	// 밥먹기, 걷기, 운동하기
	
	// public(공공의) : 클래스 내/외부에서 접근이 가능하도록
	// private, protected, default
	public void eat() {
		System.out.println("밥을 먹는 중 쿰척쿰척");
	}
	public void walk() {
		System.out.println("걷는 중 뚜벅뚜벅");
	}
	public void exercise() {
		System.out.println("운동하는 중 으쌰으쌰");
	}
	
	
}

Main  클래스

package person;

public class Main {

	public static void main(String[] args) {
		
		// 설계도가 객체가 되는 공간( 실행되는 공간 )
		// 1. 설계도면을 가지고 객체 생성( 사람 만들기 )
		Person p1 = new Person(20,"여자","장원영","O형");
		// p1 --> 주소값
		// p1이라는 주소 안에 이름, 아니, 혈액형, 성별의 공간이 있다.
		// p1에 있는 이름이라는 필드에 접근(.)
		//p1.name = "장원영";
		//p1.age = 20;
		//p1.bloodType = "O형";
		//p1.gender = "여자";
		System.out.println(p1.name);
		System.out.println(p1.bloodType);
		System.out.println(p1.gender);
		System.out.println(p1.age);
		
		p1.eat();
		p1.exercise();
		p1.walk();
		
		Person p2 = new Person(33,"남자","박동명","O형");
		//p2.name = "박동명";
		//p2.age = 33;
		//p2.bloodType = "O형";
		//p2.gender = "남자";
		
		System.out.println(p2.name);
		System.out.println(p2.age);
		System.out.println(p2.bloodType);
		System.out.println(p2.gender);
		
		p2.eat();
		p2.exercise();
		p2.walk();			
		
		Person p3 = new Person();
	}
	
	

}

예제)

PiggyBank 클래스

package PiggyBank;

public class PiggyBank {

	// 저금통이 설계도면 (class)
	// 필드(field)
	// 저금통의 주인
	private String name;

	// 저금통의 잔액
	private int money;
	
	// public : 클래스 내/외부에서 접근 가능하게하는 제한자
	// private : 클래스 내부에 있는 메서드를 통해서 접근이 가능한 제한자
	
	// get/set 메서드
	// get : 필드를 가져와서 확인하는 메서드
	public int getMoney() {
		return money;
	}
	public String getName() {
		return name;
	}
	// set : 값을 받아와서 필드에 데이터 값을 넣어준다
	//		 수정한다, 바꿔준다
	public void setMoney(int money) {
		this.money = money;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	// 메서드(method)
	// 생성자(constructor)
	// : 객체를 생성할때 필드에 있는 데이터를 초기화
	// 시킬 수 있는 메서드
	// 1) 생성자고 메서드이다.
	// 2) 메서드의 이름이 클래스의 이름과 동일하다.
	// 3) 리턴타입을 지정하지 않는다(void -> X)
	// 4) 매개변수로 아무것도 받지 않는 생성자를 기본생성자
	// ---> 기본생성자는 생략
	// ---> 단, 새로운 생성자를 만든다면 기본생성자는 덮어씌워진다.
	// (사용할 수 없음)
	// ---> 오버로딩(중복정의)
	public PiggyBank(String name, int money) {
		this.name = name;
		this.money = money;
	}

	// 돈을 넣는다(deposit)
	public void deposit(int money) {
		this.money += money;
	}

	// 돈을 인출한다(withdraw)
	public void withdraw(int money) {
		this.money -= money;
	}

	// 잔액을 보여준다(whowMoney)
	public void showMoney() {
		System.out.println(name + "님의 잔액은 " + money + "원 입니다.");
	}

}

Main클래스

package PiggyBank;

public class Main {

	public static void main(String[] args) {
		
		// 실행공간
		// 1. PiggyBank 설계도면을 가지고 bank를 생성
		PiggyBank bank = new PiggyBank("박동명",7000);
		// bank -> 참조변수, 참조값(주소값)
		System.out.println(bank);
		// 2. bank에 본인 이름넣기
		//bank.name = "박동명";
		bank.getName();
		System.out.println(bank.getName());
		bank.setName("이정재");
		System.out.println(bank.getName());
		// 3. bank에 기본 잔액을 7,000원을 추가해 주세요
		//bank.money = 7000;
		bank.getMoney();
		System.out.println(bank.getMoney());
		// 4. bank에 3,000원을 입금
		bank.deposit(3000);
		// 5. 잔액을 확인하자
		bank.showMoney();
		// 6. bank에서 2000원을 출금
		bank.withdraw(2000);
		// 7. 잔액을 확인하자
		bank.showMoney();
	}

}

다음에 계속..

728x90

'Study > JAVA' 카테고리의 다른 글

JAVA기초 13일차 <arraylist>  (1) 2022.09.24
JAVA기초 12일차 <객체지향2>  (0) 2022.09.24
JAVA기초 10일차 <메서드>  (0) 2022.09.24
JAVA 기초 9일차 <메서드>  (2) 2022.09.24
JAVA기초 8일차 <이차원 배열>  (1) 2022.09.24
복사했습니다!