객체 (Object)
독립적으로 각각 구분해서 인식할 수 있는 모든 것
- 물건, 물체, 요소, 대상, 목적
- 예시) 키보드, 김치, 나, 조원, 미세먼지, 모래 한 알, 판소리 무형문화재지향 (Oriented)
: 어떠한 것을 목표로 함
객체 지향
: 독립적으로 각각 구분해서 인식할 수 있는 것을 목표로 함
(컴퓨터에서의) 언어 (Language)
: 코드, 코딩 방식
객체 지향 언어
: 독립적으로 각각 구분해서 인식할 수 있는 것을 목표로 하는 코딩 방식
* 현실에서 객체(Object)란?
- 자신의 속성(값, data)과 기능(동작,행동)이 다른 것들과 구분되어 식별 가능한 것
* 객체 지향 언어란?
- 현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다.
- 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
* 자바에서 객체(Object)란?
- 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것
- 캡슐화 (Encapsulation)
- 상속 (Inheritance)
- 다형성 (Polymorphism)
- 추상화 (Abstraction)
- 객체의 특성(속성, 기능)에 대한 정의를 한 것
== 객체를 만들기 위한 설계도
속성 == 값 == data
기능 == 행동 == method
- ex) 제품의 설계도, 빵 틀
- 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미
- 작성하려는 클래스의 속성과 기능 중 프로그램에서 필요한 공통점을 추출하고, 불필요한 부분을 제거하는 과정
service 패키지와 vo(Value Object) 패키지 만들기
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();
}
}
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(); 코드를 작성하였을 때 메모리 구조는 위 그림과 같다.
- 데이터와 기능을 하나로 묶어서 관리하는 기법
- 데이터의 직접적인 접근을 제한하는 것이 원칙이다.
-> 직접 접근을 못하기 때문에 클래스 내부에 간접 접근 방법을 제공하는 기능을 작성해 둔다.
- 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());