객체 지향 프로그래밍 (23.04.27)

·2023년 4월 27일
0

Java

목록 보기
17/35
post-thumbnail

📝 객체 지향 프로그래밍(OOP)


💡 주요 용어

객체 (Object)

독립적으로 각각 구분해서 인식할 수 있는 모든 것
- 물건, 물체, 요소, 대상, 목적
- 예시) 키보드, 김치, 나, 조원, 미세먼지, 모래 한 알, 판소리 무형문화재

지향 (Oriented)

: 어떠한 것을 목표로 함

객체 지향

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

(컴퓨터에서의) 언어 (Language)

: 코드, 코딩 방식

객체 지향 언어

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

💡 객체 지향 언어

* 현실에서 객체(Object)란?
- 자신의 속성(값, data)과 기능(동작,행동)이 다른 것들과 구분되어 식별 가능한 것

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

* 자바에서 객체(Object)란?
- 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

✏️ 객체 지향의 4대 특징

  1. 캡슐화 (Encapsulation)
  2. 상속 (Inheritance)
  3. 다형성 (Polymorphism)
  4. 추상화 (Abstraction)

💡 클래스(class)

  • 객체의 특성(속성, 기능)에 대한 정의를 한 것
    == 객체를 만들기 위한 설계도

    속성 == 값 == data
    기능 == 행동 == method

    • ex) 제품의 설계도, 빵 틀

💡 추상화(abstraction)

  • 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미
  • 작성하려는 클래스의 속성과 기능 중 프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정
  • [예시] 국민(사람)이라는 객체 만들기!

  1. service 패키지와 vo(Value Object) 패키지 만들기

    • service 패키지 : 특정 기능(비즈니스 로직)을 제공하는 클래스
    • vo 패키지 : 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지
  2. AbstractionService 클래스 살펴보기

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

import edu.kh.oop.abstraction.model.vo.People;

// Service : 특정 기능(비즈니스 로직)을 제공하는 클래스

public class AbstractionService {
	// 해당 클래스가 객체가 되면 아래 예제 기능을 수행할 수 있다.
	
	public void ex1() {
		
		// 국민 객체 만들기
		
		new People();
		// People p1 : People 객체의 주소를 저장하여 참조하는 변수 p1
		// new People() : 새로운 people 객체를 Heap 영역에 생성
		
		// *** 클래스 이름이 자료형처럼 사용되어짐!
		// == 그래서 클래스를 "사용자 정의 자료형" 이라고도 한다! ***
		
		People p2 = new People();
		
		// 만들어진 객체는 추상화가 적용되어 있어 누군지 알 수 없음
		// -> 속성(데이터)을 추가하여 누구인지 알 수 있게 함(구체화)
		
		p1.name = "다나카";
		p1.age = 27;
		p1.gender = '남';
		p1.phone = "010-1234-1234";
		p1.pNo = "002022-12345678";
		p1.address = "서울시 강남구 어쩌고 저쩌고";
		
		System.out.println("p1의 name :" + p1.name);
		System.out.println("p1의 age :" + p1.age);
		System.out.println("p1의 gender :" + p1.gender);
		System.out.println("p1의 phone :" + p1.phone);
		System.out.println("p1의 pNo :" + p1.pNo);
		System.out.println("p1의 address :" + p1.address);
		
		System.out.println("---------------------------------------------");
	
		p2.name = "전혜선";
		p2.age = 18;
		p2.gender = '여';
		p2.phone = "010-1234-4321";
		p2.pNo = "006722-12345678";
		p2.address = "서울시 구로구";
		
		System.out.println("p2의 name :" + p2.name);
		System.out.println("p2의 age :" + p2.age);
		System.out.println("p2의 gender :" + p2.gender);
		System.out.println("p2의 phone :" + p2.phone);
		System.out.println("p2의 pNo :" + p2.pNo);
		System.out.println("p2의 address :" + p2.address);

		p1.tax();
		p1.vote();
		p2.tax();
		p2.vote();
	}
}
  1. People 클래스 살펴보기
package edu.kh.oop.abstraction.model.vo;

// VO (Value Object) : 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지

public class People { // 국민(사람) 클래스
	
	// 클래스란? 객체의 특성(속성, 기능)을 정의한 것
	// == 객체를 만들기 위한 설계도
	
	// 속성 == 값 == data
	// 값을 저장하기 위한 변수 선언
	// -> 국민이라면 공통적으로 가지고 있는 속성만 작성(추상화)
	public String name;
	public char gender;
	public String pNo; // "123456-1234567"
	public String address;
	public String phone;
	public int age;
	//double bitCoin; // 공통점이 아니므로 제거
	
	// 기능 == 행동 == method
	
	public void tax() {
		System.out.println("세금을 냅니다.");
	}
	
	public void vote() {
		System.out.println("투표를 합니다.");
	}

}
  • [실행 결과]

→ People p1 = new People(); 코드를 작성하였을 때 메모리 구조는 위 그림과 같다.

💡 캡슐화 (Encapsulation)

  • 데이터와 기능을 하나로 묶어서 관리하는 기법
  • 데이터의 직접적인 접근을 제한하는 것이 원칙이다.
    -> 직접 접근을 못하기 때문에 클래스 내부에 간접 접근 방법을 제공하는 기능을 작성해 둔다.

✏️ 데이터 직접 접근 제한 방법

  • public(공공의) → private(사적인, 개인적인) 변경
  • 간접 접근 기능(getter / setter) 자동 추가 방법
    • alt + shift + s
    • 상단 메뉴 Source -> Generate Getters and Setters ... 클릭
      -> Select All -> Generate

  • 작성 방법
    - getter : get + 필드명
    - setter : set + 필드명
  • [예시] 위 코드를 간접 접근 방법으로 바꿔 보기
	// public class People 내
	// 기존 public을 private으로 바꿔 주기
    
	private String name;
	private char gender;
	private String pNo;
	private String address;
	private String phone;
	private int age;
    
   	// 캡슐화에서 사용할 간접 접근 기능(getter / setter)
	
	public void setName(String name) { // setter
		// 외부로부터 전달받은 name
		// 현재 객체의 속성 중 name ( == this.name)에 대입
		this.name = name;
	}
	
	public String getName() { // getter
		// 현재 객체의 속성 중 name을 호출한 곳으로 반환(return)
		return 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 class AbstractionService 내
    
		// p1.name = "다나카"; // The field People.name is not visible
		// 직접 접근 방법 -> name이 private이라서 이 방법으로는 접근이 불가능함
		
		p1.setName("다나카"); // setter를 이용한 간접 접근 방법
		
		// p1.age = 27;
		p1.setAge(27);
		
		// p1.gender = '남';
		p1.setGender('남');
		
		// p1.phone = "010-1234-1234";
		p1.setPhone("010-1234-1234");
		
		// p1.pNo = "002022-12345678";
		p1.setpNo("002022-12345678");		
		
		// p1.address = "서울시 강남구 어쩌고 저쩌고";
		p1.setAddress("서울시 강남구 어쩌고 저쩌고");		
		
		System.out.println("p1의 name :" + p1.getName());
		System.out.println("p1의 age :" + p1.getAge());
		System.out.println("p1의 gender :" + p1.getGender());
		System.out.println("p1의 phone :" + p1.getPhone());
		System.out.println("p1의 pNo :" + p1.getpNo());
		System.out.println("p1의 address :" + p1.getAddress());
  • [출력 결과]


profile
풀스택 개발자 기록집 📁

0개의 댓글