현실에서의 객체
객체 (Object): 독립적으로 각각 구분해서 인식할 수 있는 모든 것-> 자신의 속성(값, data)과 기능(동작, 행동)이 다른 것들과 구분되어 식별가능한 것
// -물건, 물체, 요소, 대상, 목적
ex) 키보드, 김치, 나, 조원, 미세먼지, 모래 한 알, 판소리 무형문화제
지향 (Oriented): 어떠한 것을 목표로 함
(컴퓨터에서의)언어(Language): 코드, 코딩 방식
객체 지향 언어: 독립적으로 각각 구분해서 인식할 수 있는 것을 목표로 하는 코딩 방식
//현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다. 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
객체 지향 언어
package edu.kh.oop.abstraction.model.vo;
//VO (Value Object): 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지
public class People { //국민(사람)클래스
//클래스: 객체의 특성(속성, 기능)을 정의한 것
// == 객체를 만들기 위한 설계도
//캡슐화(Encapsulation)
// -데이터와 기능을 하나로 묶어서 관리하는 기법
// -데이터에 직접적인 접근을 제한하는 것이 원칙이다.
// -> 직접 접근을 못하기 때문에 클래스 내부에 간접 접근 방법을 제공하는 기능을 작성해둔다.
//***데이터 직접 접근 제한
// public(공공의) -> private(사적인, 개인적인) 변경
//속성 == 값 == data
//값을 저장하기 위한 변수 선언
// ->국민이라면 공통적으로 가지고 있는 속성만 작성(추상화)
private String name;
private char gender;
private String pNo; //123456-1234567 int로 할 경우 연산이 됨
private String address;
private String phone;
private int age;
// double bitCoin; //공통점이 아님로 제거
//기능 == 행동 ==method
public void tax() {
System.out.println("세금을 냅니다.");
}
public void vote() {
System.out.println("투표를 합니다.");
}
//캡슐화에서 사용할 간접 접근 기능(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 void setName(String name) {
this.name = name;
}
//단축키: alt shift S 또는 상단 메뉴 Source
// -> Generate Getters and Setters....클릭
// -> select All -> generate
}
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
//직접 접근 방법
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("002121-53697875");
// 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());
System.out.println("===============================");
// p2.name = "ㅐㅐㅐ";
// p2.age = 2;
// p2.gender = '여';
// p2.phone = "010-1234-5678";
// p2.pNo = "981022-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.run;
import edu.kh.oop.abstraction.model.service.AbstractionService;
public class AbstractionRun {
public static void main(String[] args) {
AbstractionService as = new AbstractionService();
as.ex1();
}
}