고래씌
[JAVA] 7. 객체(추상화, 캡슐화) 본문
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 |