

다형성 : 다양한 형태를 지닌 성질
독립적으로 각 구분해서 인식할 수 있는 모든 것
ex) 키보드, 밥, 나, 미세먼지, 모래 한 알, 판소리 무형문화재
지향 : 어떠한 것을 목표로 함
객체 지향 : 독립적으로 각 구분해서 인식할 수 있는 것을 목표로 함
(컴퓨터에서의) 언어(Langauge) : 코드, 코딩 방식

Heap메모리에 생성된 것은 모두 객체
ex) 배열도 객체
public class 000 { .. ..
밥을 먹는다(),
강의를 한다()
}
클래스 작성 시 반드시 필요한 것
객체 지향 언어의 특징 중
추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함
클래스의 등장 배경



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



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

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




