
Object(객체) Oriented(지향) Programming(프로그래밍)
월요일은 역시 힘들다.
하지만 월요일이 아니었어도 힘들었을거다.
힘들어도 해내야지.
현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며,
발생하는 모든 사건들은 객체간의 상호작용이다.
이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
자신의 속성(값, data)과 기능(동작,행동)이 다른 것들 과 구분되어 식별 가능한 것
클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

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


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

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


객체의 특성(속성, 기능)에 대한 정의를 한 것
ex) 제품의 설계도, 빵 틀
객체 지향 언어의 특징 중
추상화(abstraction), 캡슐화(encapsulation)이 적용되어야 함





package edu.kh.oop.abstraction.model.vo;
// VO(Value Object) : 값 저장용 객체를 만들기 위한 클래스를 모아두는 패키지
public class People { // 국민(사람) 클래스
// 클래스란 ? 객체의 특성(속성, 기능)을 정의한 것
// == 객체를 만들기 위한 설계도
// 캡슐화
// - 데이터와 기능을 하나로 묶어서 관리하는 기법
// - 데이터의 직접적인 접근을 제한하는 것이 원칙이다.
// -> 직접 접근을 못하기 때문에
// 클래스 내부에 간접 접근 방법을 제공하는 기능을 작성해둔다.
// 속성 == 값 == data
// 값을 저장하기 위한 변수 선언
// -> 국민이라면 공통적으로 가지고 있는 속성만 작성 (추상화)
// 이름, 성별, 주민번호, 주소, 전화번호, 나이
// 필드 == 필드 변수 == 멤버 변수 == 클래스 변수
private String name;
private char gender;
private String pNo; // "220303-3456789"
private String address;
private String phone;
private int age;
//public double bitCoin; // 공통점이 아니므로 제거
// *** 데이터 직접 접근 제한 ***
// public(공공의) -> private(사적인, 개인적인) 변경
// 기능 == 행동 == method
public void tax() {
System.out.println("세금을 냅니다.");
}
public void vote() {
System.out.println("투표를 합니다. 꼭하세요!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = 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;
}
// alt + shift + s 또는 상단 메뉴 Source 클릭
// -> Generate Getters and Setters... 클릭
// -> selectAll -> generate
// 캡슐화에서 사용할 간접 접근 기능(getter/setter)
}
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 영역에 생성
// ** 클래스 이름이 자료형처럼 사용된다
// ** 그래서 클래스를 "사용자 정의 자료형"이라고도 한다!! **
//p1.name = "홍길동";
p1.setName("홍길동");
//p1.age = 25;
p1.setAge(25);
//p1.gender = '남';
p1.setGender('남');
//p1.phone = "010-1234-5678";
p1.setPhone("010-1234-5678");
//p1.pNo = "200303-1234567";
p1.setpNo("200303-1234567");
//p1.address = "서울시 중구 남대문로 120 대일빌딩 3층 E강의장";
p1.setAddress("서울시 중구 남대문로 120 대일빌딩 3층 E강의장");
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("=========================================");
People p2 = new People();
p2.setName("송원철");
p2.setAge(3);
p2.setGender('남');
p2.setPhone("010-1234-5678");
p2.setpNo("211111-3456789");
p2.setAddress("경기도");
System.out.println("p2의 name : " + p2.getName());
System.out.println("p2의 age : " + p2.getAge());
System.out.println("p2의 gender : " + p2.getGender());
System.out.println("p2의 phone : " + p2.getPhone());
System.out.println("p2의 pNo : " + p2.getpNo());
System.out.println("p2의 address : " + p2.getAddress());
}
}





package edu.kh.oop.cls.model.vo;
public class User {
// 속성 ( == 필드 )
// 아이디, 비밀번호, 이름, 나이, 성별 ( 추상화 진행 )
// 데이터 직접접근 불가원칙 -> 필드는 기본적으로 모두 private ( 캡슐화 진행 )
private String userId;
private String userPw;
private String userName;
private int userAge;
private char userGender;
// 기능 ( == 생성자 + 메서드 )
// 생성자 : new 연산자를 통해서 객체가 생성될 때
// 생성된 객체의 필드값 초기화 + 기능 수행 역할.
// 기본 생성자
public User() {
//기능
System.out.println("기본 생성자로 User 객체 생성");
// 필드 초기화
userId = "user01";
userPw = "pass01";
userName = "홍길동";
userAge = 20;
userGender = '남';
// 기본생성자를 이용해서 User객체를 만들면
// 그 객체는 프린터 구문을 수행하고,
// 필드 초기화구문을 거쳐서 홍길동 하나가 만들어짐
}
// 캡슐화로 인한 간접 접근 기능 (getter/setter)
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPw() {
return userPw;
}
public void setUserPw(String userPw) {
this.userPw = userPw;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public char getUserGender() {
return userGender;
}
public void setUserGender(char userGender) {
this.userGender = userGender;
}
}
객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때
객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행
생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록
생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며
생성자명을 클래스명과 똑같이 지정해주어야 함

작성하지 않은 경우, 클래스 사용 시 컴파일러가 자동으로 기본 생성자 생성
package edu.kh.oop.cls.model.vo;
public class Student { // 클래스 선언부
// [접근제한자] [예약어] class 클래스명
// 접근제한자 public : 같은 프로젝트 내에서
// 어떤 클래스에서든 import 할 수 있음을 나타냄.
// 1. 필드(field) : 객체의 속성을 작성하는 클래스 내부 영역
// == 멤버 변수 : 메서드 밖에 작성된 변수
// 인스턴스 변수 : 필드에 작성되는 일반 변수
// 클래스 변수 ( == static 변수 ) : 필드에 static 예약어가 작성된 변수
/* 필드 구성 (대괄호는 생략가능)
* [접근제한자] [예약어] 자료형 변수명 [=초기값;]
* + public final 기본자료형
* # protected static (참조형)
* ~ (default) final static 배열
* - private static final 클래스명
*
*
* 필드의 접근 제한자의 뜻 : 직접 접근 가능한 범위를 나타냄.
*/
public int v1 = 10;
protected int v2 = 20;
int v3 = 30;
private int v4 = 40;
// 접근 제한자 예제
public void ex() {
System.out.println( v1 );
System.out.println( v2 );
System.out.println( v3 );
System.out.println( v4 );
}
// ---------------------------------
public static String schoolName = "KH고등학교";
private String name; // 캡슐화 원칙 -> 간접 접근 방법 필요
{// 초기화 블록 : 객체 생성 시 필드 값 초기화
setName("김길동");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 2. 생성자(constructor)
/* - new 연산자를 통해서 객체를 생성할 때
* 생성된 객체의 필드 값 초기화 + 지정된 기능을 수행하는 역할
*
* - 생성자 작성 규칙
* 1 ) 생성자의 이름은 반드시 클래스명과 같아야 한다.
* 2 ) 반환형이 존재하지 않는다.
*
* - 생성자 종류
* 1 ) 기본 생성자
* 2 ) 매개변수 생성자
*
*
*/
// 기본 생성자
// [접근제한자] 클래스명() { 코드 }
public Student() {
// 객체가 생성될 때 수행할 코드
System.out.println("기본 생성자에 의해서 Student 객체가 생성됨");
}
// 3. 메서드(method)
}
package edu.kh.oop.cls.model.service;
import edu.kh.oop.cls.model.vo.Student;
//import edu.kh.oop.cls.model.vo.TestVO;
// The type edu.kh.oop.cls.model.vo.TestVO is not visible
import edu.kh.oop.cls.model.vo.User;
public class ClsService /*extends Student*/ {
// 부모 Student를 상속받음
public void ex1() {
// 클래스 접근 제한자 확인하기
Student std = new Student();
// public class인 Student는 import가 가능
//TestVO test = new TestVO();
// (default) class인 TestVO는 import 불가(다른패키지)
System.out.println(std.v1);
// 다른 패키지에서도 접근 가능한 public만 에러 X
//System.out.println(std.v2);
//System.out.println(std.v3);
//System.out.println(std.v4);
// 상속 관계에서 직접 접근 가능
}
public void ex2() {
// static 필드 확인 예제
// 학생 객체 2개 생성
Student std1 = new Student();
Student std2 = new Student();
// 학생 객체에 name 세팅
std1.setName("홍길동");
std2.setName("김영희");
// 정보 출력
System.out.println(std1.schoolName); // public 이기 때문에 직접 접근 가능
// schoolName에 노란 줄이 뜨는 이유 -> 제대로 작성을 안해서
// *** static이 붙은 필드(변수)는 '클래스명.변수명' 으로 사용함 ***
System.out.println(Student.schoolName);
Student.schoolName = "KH";
System.out.println("변경 후 : " + Student.schoolName);
/* static
*
* 1) 공유 메모리 영역(또는 정적 메모리 영역) 이라고 함.
*
* why? 프로그램 시작 시 static이 붙은 코드들이 모두
* static 영역에 생성되고,
* 프로그램이 종료될 때까지 사라지지 않음 (정적)
* 그리고, static 영역에 생성된 변수는 어디서든지 공유 가능(공유)
*
* 2) 사용 방법 : 클래스명.변수명
*
*/
}
public void ex3() {
// 생성자 확인 테스트
// Student 객체를 기본 생성자를 이용해 생성하고 이를 참조하는 s1에 대입
Student s1 = new Student();
// 기본 생성자
// User 기본 생성자를 이용해서 객체 생성
User u1 = new User();
// User 객체 필드 초기화 확인
System.out.println( u1.getUserId() );
System.out.println( u1.getUserPw() );
System.out.println( u1.getUserName() );
System.out.println( u1.getUserAge() );
System.out.println( u1.getUserGender() );
}
}