OOP(객체지향프로그램)

oYJo·2024년 12월 17일

Java

목록 보기
15/25

OOP(Object Oriented Programming)

객체지향언어

객체 지향 3 + 1 특징

다형성 : 다양한 형태를 지닌 성질

객체 지향 언어

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

독립적으로 각 구분해서 인식할 수 있는 모든 것
ex) 키보드, 밥, 나, 미세먼지, 모래 한 알, 판소리 무형문화재

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

지향 : 어떠한 것을 목표로 함
객체 지향 : 독립적으로 각 구분해서 인식할 수 있는 것을 목표로 함
(컴퓨터에서의) 언어(Langauge) : 코드, 코딩 방식

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

Heap메모리에 생성된 것은 모두 객체
ex) 배열도 객체

객체 지향 언어 - 클래스

  • 클래스(Class)
    객체의 특성(속성, 기능)에 대한 정의를 한 것
    ex) 제품의 설계도, 빵 틀

public class 000 { .. ..
밥을 먹는다(),
강의를 한다()
}

  • 클래스 작성 시 반드시 필요한 것
    객체 지향 언어의 특징 중
    추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함

  • 클래스의 등장 배경

객체 지향 언어 - 추상화

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

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

  • JVM 메모리
  • 추상화 예시
    앞 페이지에서 추상화한 결과물을 객체 지향 프로그래밍 언어를 사용해서 변수명(데이터 이름)과 자료형(데이터 타입) 정리

앞 페이지에서 정리된 변수명과 자료형을 클래스 다이어그램으로 표현 시 아래와 같음

사람(People) 공통 속성들 저장

abstraction
class AbstractionService

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

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

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

public class AbstractionService {
	// 해당 클래스가 객체가 되면 아래 예제 기능을 수행할 수 있다.

	public void ex1() {

		//  국민 객체 만들기

		People p1 = new People();
		// People p1 : People 객체의 주소를 저장하여 참조하는 변수 p1
		// new People() : 새로운 People 객체를 Heap 영역에 생성

		// *** 클래스 이름이 자료형처럼 사용되어짐!!
		// == 그래서 클래스를 "사용자 정의 자료형" 이라고도 한다 ***


		People p2 = new People();
		// 만들어진 객체는 추상화가 적용되어 있어 누군지 알 수 없음
		// -> 속성(데이터)를 추가하여 누구인지 알 수 있게 함(구체화)

		// p1.name = "ㅇㅇㅈ"; 
		// 오류 발생 : The field People.name is not visible(People 안 보임) : 직접 접근 방법이 안된다
		p1.setName("ㅈㅎㅅ"); // setter를 이용한 간접 접근 방법

		// p1.age = 19;
		p1.setAge(19);
		// p1.gender = '여';
		p1.setGender('여');
		// p1.phone = "010-1234-1234";
		p1.setPhone("010-1234-1234");
		// p1.peopleNumber = "123456-1234567";
		p1.setPeopleNumber("123456-1234567");
		// p1.address = "대한민국";
		p1.setAddress("대한민국");

		System.out.println("p1의 name : " + p1.getName());
		System.out.println("p1의 age : " + p1.getAge());
		System.out.println("p1의 gender : " + p1.getAge());
		System.out.println("p1의 phone : " + p1.getPhone());
		System.out.println("p1의 peopleNumber : " + p1.getPeopleNumber());
		System.out.println("p1의 address : " + p1.getAddress());

		System.out.println("===================");

		/*
		p2.name = "홍길동";
		p2.age = 20;
		p2.gender = '남';
		p2.phone = "010-9898-9898";
		p2.peopleNumber = "987654-3219876";
		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의 peopleNumber : " + p2.peopleNumber);
		System.out.println("p2의 address : " + p2.address);

		p1.tax();
		p1.vote();

		p2.tax();
		p2.vote();
		 */

	}
}

class People

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

// VO(Value Object) : 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지
public class People { // 국민(사람) 클래스

	// 클래스란? 객체의 특성(속성, 기능)을 정의한 것
	// == 객체를 만들기 위한 설계도

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

	// *** 데이터 직접 접근 제한 ***
	// public(공공의) -> private(사적인, 개인적인) 변경

	// 속성 == 값 == data
	// 값을 저장하기 위한 변수 선언
	// -> 국민이라면 공통적으로 가지고 있는 속성만 작성(추상화)

	private String name;
	private int age;
	private char gender;
	private String phone;
	private String peopleNumber; // 001212-1234567 int로 작성하면 -가 빼기로 들어가기에 String
	private String address;

	// double bitCoin; // 공통점이 아니므로 제거


	// 기능 == 행동 == method
	public void tax() {
		System.out.println("세금을 냅니다.");
	}	

	public void vote() {
		System.out.println("투표를 합니다.");
	}

	// 캡슐화에서 사용할 간접 접근 기능(getter / setter)

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

	public String getName() { // getter
		return name;
	}

	public int getAge() {
		return age;
	}

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

	public char getGender() {
		return gender;
	}

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

	public String getPhone() {
		return phone;
	}

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

	public String getPeopleNumber() {
		return peopleNumber;
	}

	public void setPeopleNumber(String peopleNumber) {
		this.peopleNumber = peopleNumber;
	}

	public String getAddress() {
		return address;
	}

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

}

class AbstractionRun

package edu.kh.oop.abstraction.run;

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

public class AbstractionRun {
	public static void main(String[] args) {
		
		AbstractionService as = new AbstractionService();
		
		as.ex1();
	}
}

객체 지향 언어 - 캡슐화

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

추상화를 통해서 정리된 속성과 기능을 하나로 묶고, 속성(데이터)의 직접 접근 방지를 하는 것
이로 인해 부가적으로 정보 은닉 효과가 발생함.

  • 캡슐화 원칙
  1. 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  2. 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성한다.
  3. 멤버 메소드는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.

객체 지향 언어

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

  • 종합 정리
    현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 객체 지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)

profile
Hello! My Name is oYJo

0개의 댓글