프로그래밍 언어/java

[java] 객체 지향 언어, 클래스, 캡슐화, getter, setter

좨랭이 2021. 9. 1. 01:27

객체

 

 객체지향 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으로 출력  두가지 방법으로 출력할 수 있음. 작성자에 따라 ~~