JAVA_06_OOP_01

송지윤·2024년 2월 7일

Java

목록 보기
10/22

OOP

(Object Oriented Programming)

객체(Object : 물건, 객체)

독립적으로 각각 구분해서 인식할 수 있는 모든 것

ex) 키보드, 김치, 옆집 아저씨, 나, 미세먼지, 모래 한 알, 판소리, 무형문화재 등등

자신의 속성(값, data)과 기능(동작,행동)이 다른 것들 과 구분되어 식별 가능한 것

ex)
모니터

속성(명사)

  • 크기, 무게, 화소, 주사율, 버튼 ...

기능(동사)

  • 화면을 보여준다, 밝기를 조절한다, 주사율을 조절한다, ...

사람

속성()

  • 이름, 나이, 생년월일, 키, 몸무게, 혈액형, 주민번호 ...

기능

  • 밥을 먹는다, 강의를 한다, 잠을 잔다, 출근을 한다, ...

지향

어떤 것을 목표로 함

객체 지향

독립적으로 각각 구분해서 인식할 수 있게끔 하는 것을 목표로 함.

언어

코드, 코딩 방식

객체 지향 언어

현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다.
이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.

독립적으로 각각 구분해서 인식할 수 있는 것을 목표로 하는 코딩 방식.

ex) 내(객체)가 문(객체)을 열었다(사건). => 상호 작용
-> 이러한 일들을 컴퓨터에 그대로 집어 넣는 것

객체 지향 3+1대 특징

1. 캡슐화 (Encapsulation)

한군데에 모아두는 역할
외부로부터 보호하는 역할

추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법 (블록으로 인해 하나로 묶임)
클래스의 가장 중요한 목적인 데이터의 직접 접근제한을 원칙으로 하여
클래스 외부에서 데이터의 직접적인 접근을 막고, 대신 간접적으로 데이터에 접근할 수 메소드를 클래스 내부에 작성하는 방법
-> getter/setter (method)

코딩에서
규약 : 어떻게 하자 안지키는 경우 많은 것
규칙 : 안 지키면 패널티
원칙 : 위배하는 순간 큰 문제 야기 -> 불허

직접 접근

p1.name="홍길동"
System.out.println(p1.name); // 홍길동

간접 접근 게터세터 통해서 함

캡슐화 원칙

  1. 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  2. 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성한다.
  3. 멤버 메소드는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
private String name;
// 직접접근하려고하면 The field People.gender is not visible
private char gender;
private String pNo;
private String address;
private String phone;
private int age;

public String getName() {
	return name;
}

public void setName(String name) {
	// 매개변수 String name
    // -> String 타입의 데이터를 전달받아 저장하고 있는 변수
	// ** this : 현재 객체
	// 멤버 변수 name 에 매개변수 name 을 대입시키는 역할을 함
	this.name = name;
}

public char getGender() {
	return gender;
}

public void setGender(char gender) {
	this.gender = gender;
}

public String getpNo() {
	return pNo;
}

public void setpNo(String pNo) {
	this.pNo = pNo;
}

public String getAddress() {
	return address;
}

public void setAddress(String address) {
	this.address = address;
}

public String getPhone() {
	return phone;
}

public void setPhone(String phone) {
	this.phone = phone;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public String getName()
[접근제한자] 반환형 메서드명
가운데 String 반환형을 의미 void는 돌려줄 값 없을 때 씀

public void setName(String name) {
setter 호출한 곳에 돌려줄 값 없어서 void 사용
name 에 홍길동 들어올거임
this.name = name;
뒤에 name은 매개변수로 넘어온 name service 클래스에서 전달인자로 보냄

자동완성 단축키

alt shift s 또는 상단 메뉴 Source
-> Generate Getters and Setters...클릭
-> selectAll -> generate

2. 상속 (Inheritance)

(부모로부터 자식이 물려받는 거)
코드 길이 감소
코드의 재사용성 용이

3. 다형성 (Polymorphism)

(가장 중요한 내용)
다양한 형태를 지니는 성질

4. 추상화 (Abstraction)

(당연한 거라서 3대에 안껴주기도 함)

유연성을 확보하기 위해 구체적인 것은 제거한다는 의미
작성하려는 클래스의 속성과 기능 중
프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정

국가에서 국민 정보 관리용 프로그램을 만들려고 할 때, 프로그램에서 요구되는 "국민 한 사람"의 정보(속성)를 추상화 한다면?

5천만명 데이터 저장하기 위해 따로따로 5천만개 변수 저장 할 수 없음

-> 사람이 가지고 있는 공통속성을 만들어놓고
-> 그곳에 개개인의 정보를 넣어서 사용함
=> 코드의 길이 감소, 중복 감소, 재사용성, 유연성이 높음

자바에서 객체(Object)란?

클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것
Heap 메모리 영역에 생성

arr == 참조변수 == 레퍼런스

클래스 ( class )

속성, 생성자, 기능 영역이 있음
객체의 특성(속성, 기능)에 대한 정의를 한 것
ex) 제품의 설계도, 빵 틀

Scanner sc = new Scanner(System.in);
뒷 부분 new 연산자 통해 만들어진 객체
만들 때 필요한 게 class(설계도)

클래스 선언

클래스 예시

속성

public class Member {
	private String name;
	private int age;

생성자

	public Member() {}

기능

	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 class 모니터 {
	(속성)
	해상도 :
	크기 : 
...
	(기능)
	화면을 보여준다.
    
}

MVC 패턴
Model
View
Controller

클래스 작성 시 반드시 필요한 것

객체 지향 언어의 특징 중 추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함

클래스 만들기 (추상화)

package edu.kh.oop.abstraction.model.vo;

/* MVC 패턴
 * Model - 프로그램, 어플리케이션의 데이터, 비즈니스로직 담당
 * View - 사용자에게 데이터를 시각적으로 표현하는 부분 담당
 * Controller - model,view 간의 상호작용을 조정, 제어하는 역할의 담당
 * 			  - 사용자의 입력 처리하고 대응하는 작업 담당
 * */

// Model 안에 vo가 있는 거
// VO(Value Object) : 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지
public class People { // 국민(사람) 클래스 (사람을 만들기 위한 설계도)
	
	// 클래스란? 객체의 특성(속성, 기능)을 정의한 것
	// 객체를 만들기 위한 설계도
	
	// 속성 == 값 == data
	// 값을 저장하기 위한 변수 선언
	// -> 국민이라면 공통적으로 가지고 있는 속성만 작성(추상화)
	// 이름, 성별, 주민번호, 주소, 전화번호, 나이
	
	// 필드 == 필드 변수 == 멤버 변수 == 클래스 변수
	// (필드 부분) public 접근 제한자 (모두 접근 가능)
	public String name;
	public char gender;
	public String pNo; // "220303-22222222"; 주민번호
	public String address;
	public String phone; // "010-1234-1234"
	public int age;
	// public double bitCoin; // 공통점이 아니므로 제거
	//   public      int      age;
	//[접근제한자]  자료형   변수명
	
	// 기능 == 행동 == method(메서드)
	public void tax() {
		System.out.println("세금을 냅니다...");
	}
	
	public void vote() {
		System.out.println("투표를 합니다...");
	}
	
}

객체 만들기 (추상화)

package edu.kh.oop.abstraction.model.service;

import edu.kh.oop.abstraction.model.vo.People;
// ctrl + shift + o : 해당 클래스에서 임포트 안된 거 전부 임포트하기

// Service : 특정 기능(비지니스 로직)을 제공하는 클래스
public class AbstractionService {
	
	public void ex1() { // method 생성 vo에 기능 이용할 것임
		// 국민 객체 만들기
		// 설계도를 통해서 만들어진 게 객체
		
		People p1 = new People();
		// People p1 : People 객체의 주소를 저장하여 참조하는 변수 p1
		// new People(); : 새로운 People 객체를 Heap 영역에 생성
		// 변수명에 대입해줌
		// People 자료형 자리 (사용자 정의 자료형)
		// int num = 10;
		
		
		// ** 클래스 이름이 자료형처럼 사용된다
		// == 그래서 클래스를 "사용자 정의 자료형"이라고도 한다!! **
		
		p1.name = "홍길동";
		p1.gender ='남';
		p1.pNo = "240207-3456789";
		p1.address = "서울시 중구 남대문로 120 그레이츠청계 3층 E강의장";
		p1.phone = "010-1234-1234";
		p1.age = 0;
		
		System.out.println("p1의 name : " + p1.name);
		System.out.println("p1의 gender : " + p1.gender);
		System.out.println("p1의 pNo : " + p1.pNo);
		System.out.println("p1의 address : " + p1.address);
		System.out.println("p1의 phone : " + p1.phone);
		System.out.println("p1의 age : " + p1.age);
	}
}

클래스 접근제한자

[] => 대괄호 생략 가능
() => 소괄호 무조건 생략

public 누구나 쓸 수 있음(공공의) : 어디서든지 import 할 수 있다.
(default) 외부 패키지 사용 불가

간접 접근

p1.setName("홍길동"); // setName 호출하면서 "홍길동" 전달
p1.setGender('남');
p1.setpNo("240207-3456789");
p1.setAddress("서울시 중구 남대문로 120 그레이츠청계 3층 E강의장");
p1.setPhone("010-1234-1234");
p1.setAge(0);
		
System.out.println("p1의 name : " + p1.getName());
System.out.println("p1의 gender : " + p1.getGender());
System.out.println("p1의 pNo : " + p1.getpNo());
System.out.println("p1의 address : " + p1.getAddress());
System.out.println("p1의 phone : " + p1.getPhone());
System.out.println("p1의 age : " + p1.getAge());

객체(Instance)의 할당

new 연산자와 생성자를 사용하여 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의
데이터가 연속으로 나열/할당된 객체 공간

다른 객체 만들기

People p2 = new People();
p2.setName("송지윤");
p2.setGender('여');
p2.setpNo("123456-2******");
p2.setAddress("서울시 중구 남대문로 120 그레이츠청계 3층 E강의장");
p2.setPhone("010-1234-1234");
p2.setAge(28);

System.out.println("p2의 name : " + p2.getName());
System.out.println("p2의 gender : " + p2.getGender());
System.out.println("p2의 pNo : " + p2.getpNo());
System.out.println("p2의 address : " + p2.getAddress());
System.out.println("p2의 phone : " + p2.getPhone());
System.out.println("p2의 age : " + p2.getAge());
p2.tax();
p2.vote();

실행 (추상화)

package ehu.kh.oop.abstraction.run;

import edu.kh.oop.abstraction.model.service.AbstractionService;

public class AbstractionRun {
	public static void main(String[] args) {
		
		
		// 서비스 클래스 객체 생성
		// 그 객체에서 ex1() 호출
		AbstractionService as = new AbstractionService();
		
		as.ex1();
	}
}

클래스의 등장 배경

변수 : 1개의 자료형, 1개의 데이터
배열 : 1개의 자료형, 여러 개의 데이터
구조체 : (java에는 없는 개념) 여러 개의 자료형, 여러 개의 데이터 (속성만 있음)

속성과 기능 모두 필요해서 등장한 게 class

풀어보기

이름 name
계좌 번호 accountNumber
잔액 balance
비밀번호 password

(추상화/캡슐화)

메서드

  • getter/setter
  • deposit(amount) : 전달 받은 금액을 잔액에 누적한 후, 현재 잔액을 콘솔에 출력
  • withdraw(pw,amount) : 비밀번호와 출금할 금액을 전달 받아와,
    조건에 맞으면 잔액에서 차감 후 현재 잔액 출력
    조건 1. 비밀번호와 일치하지 않으면 "비밀번호 불일치" 출력
    조건 2. 출금할 금액이 잔액보다 크면 "잔액 부족" 출력

실행용 클래스 : AccountRun -> main()

public class Account { // 계좌 클래스

	// 속성 (값)
	private String name; // 이름
	private String accountNumber; // 계좌번호
	private long balance; // 잔액
	private String password; // 비밀번호

getter/setter

	// 기능
 	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getAccountNumber() {
		return accountNumber;
	}
	
	public void setAccountNumber(String accountNumber) {
		this.accountNumber = accountNumber;
	}
	
	public long getBalance() {
		return balance;
	}
	
	public void setBalance(int balance) {
		this.balance = balance;
	}
	
	public String getPassword() {
		return password;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}

입금, 출금 기능

	public void deposit(long amount) {
		balance += amount;
		System.out.println(name + "의 현재 잔액 : " + balance + "원");
	}
	
	public void withdraw(String pw,long amount) {
		if(!password.equals(pw)) {
			System.out.println("비밀번호 불일치");
			return; // 메서드 종료 -> 호출한 곳으로 돌아감
		}
		
		// 출금할 금액이 잔액보다 큰 경우
		if (amount > balance) {
			System.out.println("잔액 부족");
			return;
		}
		
		// 잔액을 출금할 금액만큼 차감
		balance -= amount;
		System.out.printf("%s 계좌에서 %d원 출금\n", accountNumber, amount);
		System.out.println(name + "의 현재 잔액 : " + balance);
	}
}

실행 클래스
main method 생성

package edu.kh.oop.basic;

public class AccountRun {
	public static void main(String[] args) {

계좌 클래스 연결해서 불러오기

		Account a1 = new Account();

		a1.setName("송지윤");
		a1.setAccountNumber("1234-56-7890");
		a1.setBalance(100000);
		a1.setPassword("7890");
		
		System.out.println( a1.getName());
		System.out.println( a1.getAccountNumber());
		System.out.println( a1.getBalance());
		System.out.println( a1.getPassword());
		
		a1.deposit(200000); // 입금
		a1.withdraw("1234", 100000);
		a1.withdraw("7890", 100000000);
		a1.withdraw("7890", 1000);

계좌 클래스 이용해서 한 사람 계좌 하나 더 만들기

		Account a2 = new Account();
		
		a2.setAccountNumber("7777-777-77777");
		a2.setName("박수찬");
		a2.setBalance(1000);
		a2.setPassword("1111");
		
		a2.deposit(10000);
		a2.withdraw("2222", 1000);
		a2.withdraw("1111", 10000000);
		a2.withdraw("1111", 5000);
	}
}

실행 클래스에서 set으로 값 넣고 get으로 꺼내와 출력

0개의 댓글