고래씌

[JAVA] 7. 객체(추상화, 캡슐화) 본문

JAVA/JAVA 기초

[JAVA] 7. 객체(추상화, 캡슐화)

고래씌 2023. 10. 11. 16:44

1. 자바에서의 객체

: 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것
 

1) 객체 지향 언어 

: "객체"를 "지향"하는 언어로 객체중심으로 돌아가는 언어

2) 객체란? 

: 사전적 의미로는 현실세계에 독립적으로 존재하는 모든 것

3) 객체지향 프로그래밍

: 현실세계의 객체간의 상호작용을 프로그래밍을 통해 가상세계로 구현하는 과정

4) 구현하고자 하는 프로그램상의 필요한 객체를 만들기 위해서는 클래스라는 틀을 먼저 만들어야함.

=> 클래스란? 각 객체들의 속성(구성요소)들을 담아낼 수 있는 그릇과도 같은 존재
=> 추상화캡슐화 과정을 거쳐 클래스를 만들 수 있음
 

2. 추상화

5) 추상화 과정

추상화 : 불필요한 공통점을 제거하는 과정
 
① 내가 구현하고자 하는 프로그램에서 필요한 객체들을 생각해볼 것 
ex) 학생 관리 프로그램 -> '학생' 객체, '선생님', ...
② 그 객체들이 가지고 있는 공통적인 속성, 기능들을 모두 추출할 것
ex) 이름, 나이, 성별, 주소, 키 등등...
③ 그렇게 추려진 속성들을 가지고 내가 구현한 프로그램의 "실질적인 목적"에 맞춰서 불필요한 속성과 기능은 제거하기
④ 최종적으로 추려진 속성 및 기능을 가지고 어떤 자료형에 어떤 이름으로 사용할 것인지 생각해보기

▶ 접근제한자 : 이 필드에 접근할 수 있는 범위를 제한할 수 있음
                         (public > protected > default > private)
                         클래스 영역 안에서 필드를 선언할 때 반드시 접근제한자를 써줘야함.
                         안쓰게 되면 default 값이 들어감.

6) 위 추상화과정을 거친후 선정된 속성을 가지고 프로그래밍을 하게 된다면?

"변수"만을 가지고 프로그래밍을 하게 된다면?
      - 변수 : 하나의 자료형으로 하나의 값만 보관할 수 있음
      - 홍길동이라는 학생 객체를 만들기위해서는 String name = "홍길동"; int age=20; double height=166.6;
      - 이고래라는 학생객체를 또 만들기위해서는 String name1="이고래"; int age1 = 30; double height1 = 190;
 
     ☞ 관리하고자하는 학생들이 늘어나면 늘어날수록 생성해야할 변수의 개수도 그만큼 증가하게 된다. 따라서, 관리가 어렵다.
 
"배열"을 이용해서 프로그래밍을 하게 된다면?
     배열 : "같은 자료형"의 데이터를 모아놓는 자료구조
     학생들의 이름만 저장하는 배열 => String[] name = {"홍길동", "이고래"};
     학생들의 나이만 저장하는 배열 => int[] age = {1, 2};
     ..
   
    ☞ 변수를 사용하는 것보다는 나아보임
    ☞ 하지만 관리하는 학생 중 한명이 전학을 간다라는 가정하에 해당 학생이 존재하는 모든 인덱스에 있는 정보들을 제거해주어야 하고, 또 새로운 학생이 들어오게 되는 경우 배열의 특성상 크기 변경이 불가능 하기 때문에 새로운 배열을 만들어줘야 하고, 또 새로운 관리해야할 속성정보가 추가되는 경우 순서에 맞는 데이터 추가가 어렵다. 즉, 유지보수가 힘들다.
 
"클래스"를 가지고 프로그래밍을 하게 된다면?
    클래스 : 한번에 여러개의 자료형을 보관할 수 있는 배열과 같은 형태
    String 값도 보관하고, int값도 보관, double 값 등 여러개의 자료형의 값을 보관할 수 있다. 각 객체들의 속성정보들을 담아내는 그릇과도 같은 존재. 보통 vo패키지 내부에 보관한다.

ex)
public class Student {
        String name = "이고래";
        int age = 50;
        double height = 140.0;
}
 
※   Student 클래스에 필드 접근제한자를 public 으로 설정시
=> 직접적으로 생성된 객체 내부의 필드에 접근이 가능
=> 데이터가 중간에 변경될 여지가 있고, 보안상 문제가 생길 수 있다.
=> 조회권한이 없는 사용자가 값을 쉽게 변경, 조회가 가능하기 때문.

☞ 이 문제를 캡슐화를 통해 해결 가능함
캡슐화 객체지향 설계원칙 중 하나!

 
<chap01_Student 클래스>

package com.kh.chap01_abstraction.model.vo;
	
public class Student {   // 학생 클래스
	// 학생 관련 프로그램.
	
	// 공통적인 속성 및 기능
	// (이름, 나이, 성별, 주소, 전화번호, 키, 학년, 반, 국어점수, 영어점수,...먹기, 자기, 생각하기, 달리기)
	
	// 불필요한 속성 제거
	// 만약, 학생의 '인적사항'을 관리하는 프로그램이라면? 이름, 나이, 성별, 주소, 전화번호, 학년, 반
	// 만약, 학생의 '성적'을 관리하는 프로그램이라면? 이름, 나이, 학년, 반, 국어점수, 수학점수
	// 최종적 적으로 추려낸것(인적사항 기준) : 이름, 나이, 키라는 가정하에
	// 이름, 나이, 키를 저장하기 위한 자료형 및 변수명을 생각하기
	
	// 필드부
	public String name; // jvm이 null값으로 초기화 시켜줌
	public int age;     //  0으로 초기화
	public double height;   // 0.0 초기화
	
	// 생성자부
	
	// 메소드부
//	public void speak() {
		
//	}

}

 
<chap01의 Run 클래스>

package com.kh.run;

import com.kh.chap01_abstraction.model.vo.Student;

public class Run {

	public static void main(String[] args) {
		
		// Student클래스 생성해보기
		// 1. Student 클래스 만들고 나서 객체 생성
		
		// 홍길동 객체 만들기
		Student hong = new Student(); // 객체 생성 완료.
		hong.name = "홍길동";
		hong.age = 20;
		hong.height = 155.5;
		
		// 이고래 학생 객체 만들기
		Student min = new Student();
		min.name = "이고래";
		min.age = 40;
		min.height = 155.5;
		
		System.out.println(hong);   // 주소값 출력됨 
		System.out.println(min);   // 주소값 출력됨 
		
		// xxx님의 나이는 xx살이고, 키는 xx.xcm입니다.
		
		System.out.printf("%s님의 나이는 %d살이고, 키는 %.1f입니다. ", hong.name, hong.age, hong.height);
	}

}

 

3. 캡슐화

7) 캡슐화과정을 통해 완벽한 클래스의 틀을 갖추게 하기

- 캡슐화란? 추상화를 통해 정의된 속성들과 기능들을 하나로 묶어 관리하는 기법 중 하나로 클래스에서의 가장 중요한 목적인 '데이터의 접근제한'을 원칙으로 외부로부터 ‘데이터의 접근을 막고' 대신에 '데이터를 간접적으로나마 처리'할 수 있는 메소드를 클래스 내부에 작성해서 관리하는 방식
 
- 캡슐화를 하지 않으면 : 외부로부터 직접접근이 가능하기 때문에 함부로 값이 변질되거나 조회를 막지 못하는 문제 발생
 
▶ 정보은닉 : private
필드들을 외부로부터 직접 접근을 막기 위해 public 대신에 private접근제한자를 사용
setter / getter 메소드
: 간접적으로나마 필드에 접근해서 값을 담거나, 그 값을 가져올 수 있는 메소드가 setter/ getter 메소드
 
 
■ 필드부
필드 == 멤버변수 == 인스턴스 변수
 
[표현법]
접근제한자 [예약어] 자료형 필드명;
 
■ 생성자부
public Student() {
 

 
■ 메소드부
각 기능을 구현하는 부분!
 
[표현법]
접근제한자 반환형 메소드명([매개변수]) {
       // 기능
}
 
setter → setXXX
해당 필드에 대입하고자하는 값을 전달받아 해당필드에 대입시켜주는 기능의 메소드. 이때, 이 메소드는 접근이 가능해야하기 때문에 public 접근제한자를 사용
 
getter ->getXXX      => void 사용 X
데이터를 반환해주는 기능의 메소드 : getter 메소드
name 필드에 담긴값을 돌려주는 용도의 메소드
get+필드명(카멀케이스 적용)
 
★ void 는 반환형(return형)이 없을 경우 작성한다!!!!!
 

<chap02의 Stundent 클래스>

=> private로 설정.
this : 생성된 객체의 name에 접근하려면 this 사용!!!
 
<chap02의 Run 클래스>

package com.kh.chap02_encapulation.model.vo;

public class Student {
	// 필드부
	
	private String name;
	private int age;
	private double height;
	
	// 이름 값을 기록 및 수정할 수 있는 기능의 메소드(name필드에 값을 세팅하기 위한 용도)
	// set+필드명 => set이라는 단어와 필드명을 합칠 때 카멀케이스를 활용하여 메소드명 작성해야한다.
	public void setName(String name) {
//		name = name;
		// 매개변수 name에 매개변수 name에 들어가 있는 값을 그대로 대입하는 부분이라 변경점이 없다.
		// 왜? 필드명과 매개변수명이 동일한 경우 {}영역 내부에서 선언한변수가 우선순위가 더 높기 때문에
		// 생성된 객체의 name에 접근하려면 this를 사용해야함.
		// this에는 생성된 객체의 "주소값"이 보관되어 있다.
		
		this.name = name; // 객체 내부의 값을 받아올 때는 this 사용!
	}
	
	// 나이값을 기록 및 수정할 수 있는 기능의 메소드(age필드에 값을 대입하기 위한 용도)
	public void setAge(int age) {
		this.age = age;
	}
	
	// 키값을 기록 및 수정 메소드
	public void setHeight(double height) {
		this.height = height;
	}
	
	
	
	// 데이터를 반환해주는 기능의 메소드 : getter 메소드
	// name 필드에 담긴값을 돌려주는 용도의 메소드
	// get+필드명(카멀케이스 적용)
	public String getName() {   // void : 반환할 값이 없는 경우에 작성하는 반환형
		return name;  // 종료하면서 반환해주는 역할을 함. return 반환값; 반환값을 나를 호출한 메소드의 위치에 반환	
	}
	
	// age에 필드에 담긴 값을 반환해주는 용도의 메소드
	public int getAge() {
		return age;
	}
	
	// height 필드에 담긴 값을 반호나해주는 용도의 메소드
	public double getHeight() {
		return height;
	}
	
	
}
package com.kh.chap02_encapulation;

import com.kh.chap02_encapulation.model.vo.Student;

public class Run {
	public static void main(String[] args) {
		Student hong = new Student();
//		hong.name = "홍길동";
//		hong.age = 40;
//		hong.height = 150.5;
		
		hong.setName("홍길동");
		hong.setAge(30);
		hong.setHeight(111.1);
		
		// getter 메소드 없이는 저장한 값을 얻어올 수 없음
//		System.out.println(hong.name);  // 에러 발생. name 필드에 저장된 값을 가져오기 위해서는 get메소드 필요!
		
		
		System.out.println(hong.getName());
		System.out.println(hong.getAge());
		System.out.println(hong.getHeight());
		
		
		
		// 학생 객체를 하나 새롭게 생성하고
		// 생성된 학생 객체에 본인의 인적사항을 기록 후
		// xx님의 나이는 xx살이고 키는 xx.xcm입니다. 출력
		Student whale = new Student();
		whale.setName("이고래");
		whale.setAge(25);
		whale.setHeight(180);
		
		System.out.printf("%s님의 나이는 %d살이고 키는 %.1fcm입니다.", whale.getName(), whale.getAge(), whale.getHeight());
	}
}

 

'JAVA > JAVA 기초' 카테고리의 다른 글

[JAVA] 7-1. 클래스(Class)  (0) 2023.10.12
[JAVA] 배열까지 종합문제  (0) 2023.10.12
[JAVA] 6. 2차원 배열  (0) 2023.10.11
[JAVA] 5-2. 배열 복사(얕은 복사, 깊은 복사  (0) 2023.10.11
[JAVA] 5-1. 배열 실습문제  (0) 2023.10.11