[java] 객체 지향 언어, 클래스, 캡슐화, getter, setter
객체
객체지향 3+1대 특징
1. 캡슐화(Encapsulation)
2. 상속(Inheritance) + 추상화(Abstraction)
3. 다형성(Polymorphism)
객체지향 언어란?
- 현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다.
- 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다.
자바에서 객체란?
- 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것
클래스(class)
- 객체의 특성(속성, 기능)에 대한 정의를 한 것 ex) 제품의 설계도, 빵 틀
변수 (다량의 데이터를 효율적으로 다뤄보자) -> 배열 -> 구조체
1개의 자료형 1개의 자료형 여러개의 자료형 + 기능 => 클래스
1개의 데이터 여러개의 데이터 여러개의 데이터
- 반드시 추상화(abstraction), 캡슐화(encapsulation)가 적용되어야 함
추상화(abstraction)
- 유연성을 확보하기 위해 구체적인 것은 제거
- 작성하려는 클래스의 속성과 기능 중
- 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정
캡슐화(encapsulation)
- 추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법
- 클래스의 가장 중요한 목적인 데이터의 접근제한을 원칙으로 하여 클래스 외부에서 데이터의 직접 접근을 막고, 대신 데이터를 처리하 는 함수들을 클래스 내부에 작성
캡슐화 원칙
- 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
- 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
- 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
객체(Instance)의 할당
- new 연산자와 생성자를 사용하여 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간
- Student는 생성자
- Heap영역 안에 속성에 해당하는 자료형만큼 공간이 할당
- 인스턴스화 : 클래스를 통해서 객체를 만드는 것
- 인스턴스 : 클래스가 메모리에 실체화 된 것
- 속성들은 heap메모리마다 별도로 저장 (객체마다 따로 존재해야하기 때문)
- 메소드(기능)는 Static영역에 저장 (공유해서 사용하기 때문)
실습
변수로만 객체를 만드는 경우
- 각 변수명을 각자 입력해야한다.
- 데이터 수정시 찾아가서 수정해야 한다.
- 프로그램에서 필요한 속성만 추출 => 추상화
- 변수명만 알면 직접 접근하여 값을 넣어줄 수 있다
- 그러나 직접 접근(public)하면 값(속성)을 누군가 변경할 수 있다.
캡슐화
- private를 붙인다
** Student 에러
Ctrl + F 로 public을 private으로 전체바꿈
class 는 public 이어야 함 ! 주의
not visiblie
- 캡슐화한 클래스를 import
=>접근자를 private으로 바꿨으니(캡슐화) 직접 접근하는 것들은 다 에러
그럼 직접 접근이 안되는데 어떻게 필드에 접근해서 값을 읽거나 수정해야하는 건가요????
-> 간접적으로 접근할 수 있는 메소드를 만들어야 한다.
getter , setter 메소드
getter 구조 <접근>
public(외부에서 접근이 가능해야 함) int(반환하는 값의 자료형) getId() {
return(호출한 쪽으로 반환) this.id(값)
}
- heap영역에 만들어 주기 때문에 JVM이 기본값 0 이 들어있다.
setter 구조 <수정>
public(외부에서 접근이 가능해야 함) void setId(int id)(매개 변수) {
this.id = id;
}
Application 에서
lim.setId(20); 하면 20이라는 값이 id라는 매개변수에 담아서 실행구문(this.id = id;)에서 사용하게 된다.
** this 를 지우면
- id = id 매개변수 id에 다시 본인을 대입한다.
- 매개변수가 우선이 되기 때문에 필드를 가르킬 수 없다.
- this.(객체 자신을 가르킨다.(객체의 주소값) 필드에 접근
Application
- id값을 얻어옴
- 값이 20으로 변경
- getId는 변경된 id값을 얻어오기 위함
getter, setter 편하게 만들기
단축키 : Alt + Shift + s -> generate getter and setter
getter, setter 연습
math,engScore에 -(마이너스)값을 입력했을 0으로 나오게 if문 넣기
- set에 조건문을 삽입하여 원하는 결과값을 만든다.
경기도 까지만 보이게 출력하고 싶을 때
- substring 문자열을 잘라내는 메소드
printf 문을 쉽게 출력하는 방법
- information은 객체에 대한 정보를 String)로 만들어서 return해주는 메소드
Application
println에 lim.information메소드를 호출
접근 제한자
- 위 **Student오류 참고
Application
1. return으로 출력
2. println으로 출력 두가지 방법으로 출력할 수 있음. 작성자에 따라 ~~