본문 바로가기
Java/Java 이론 정리

[Java] 21~22일차: 객체지향 3대요소_캡슐화, 상속, 다형성

by ProSeraphina 2020. 7. 13.

객체지향 프로그래밍

: 유지보수를 용이하게 만드는 기법 → 단점: 실행속도 늦음( 보완: POJO(Spring))

 ***객체지향 자체에 너무 얽매이지 말고 프로그램의 완성에 초점을 둘 것

 ***객체지향 3대요소: 캡슐화, 상속, 다형성

 

1. 데이터 보호 

  - 값이 프로그램과 관련없이 변질, 변경될 수 있음 

    캡슐화: 알고리즘+데이터, (클래스 단위로 묶어서)경계 구분 및 (데이터 보호를 위한)은닉화

       ***은닉화: 데이터를 사용하지 못하게 만드는 작업

    감춘 데이터는 메소드를 통해 접근 가능(Getter/Setter 활용)

 

    ▶Getter(저장된 데이터 값 읽기), Setter(변수값 저장) 사용

       1. lombok 라이브러리 사용

          1) https://mvnrepository.com//artifact/org.projectlombok/lombok >> 1.18.12 .jar 다운로드 >> install

             >> 위치: eclipse.exe

          2) 이클립스에서 라이브러리 추가를 원하는 Java Project 우클릭 >> buildpath >> configure bulidpath

             >> Add External JARs >> lombok-1.18.12 찾아서 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
 
class Student{
 
    private int hakbun;
    private String name;
    private String sex;
    public int getHakbun(){
        return hakbun;
    }
cs

 

   2. 이클립스 자체 기능 사용: 빈 칸에 우클릭 >> Source >> generate Getters and Setters

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Student{
 
    private int hakbun;
    private String name;
    private String sex;
    public int getHakbun(){
        return hakbun;
    }
 
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
    public String getSex(){
        return sex;
    }
    public void setSex(String sex){
        this.sex=sex;
    }
    public void setHakbun(int hakbun){
        this.hakbun=hakbun;
    }    
}
cs

 

***접근지정어

  같은 클래스 같은 폴더(패키지) 다른 폴더에서
상속 받는 경우
모든 클래스
public O O O O
protected O O O X
default O O X X
private O X X X

 - 접근 범위 크기: private < default < protected < public

    1) public: 전체 공개, 어떤 위치든 상관없이 사용 가능

        ex) public int age;

    2) protected: 상속을 받는 경우 하위 클래스에서 사용 가능(사용빈도 적음)

        ex) protected String name;

        상속에서의 예외조건

        1. static: 사용 가능하나 의미 없음

        2. private: 상속 가능하나 사용 불가

        3. 생성자: 상속 불가

    3) default: 같은 패키지(src) 안에서만 사용 가능

        ex) String name;

    4) private: 비공개, 자신의 클래스에서 사용 가능

                   →다른 클래스에서 사용하려면 메소드를 통해 접근 가능

        ex) private int age;

 

 - 사용방식

    멤버변수(일반변수:기본형 / 배열,클래스: 참조변수): 다른 클래스에서 값을 변경할 수 없게 은닉화 →private

    메소드, 생성자: 다른 클래스와 연결해서 프로그램 동작 →public

 

2. 재사용 기법

   1)상속(inheritance, is-a): 이미 만들어진 기능을 변경해서 사용(오버라이딩) 가능

     ex) public class MyWindow extends JFrame

     - 상속하는 클래스: super(생략 불가), 상속받는 클래스: this(생략 가능)

     - Java에서는 단일상속만 가능

     - Java의 모든 클래스는 java.lang.Object를 디폴트로 상속받음(모든 클래스의 최상위 클래스) → 형변환 주의

       ex)형변환: 고양이 nyanya=(고양이)new 동물;

 

   2)포함(has-a): 변경없이 그대로 사용

     ex) public class MyWindow{

            JFrame f=new JFrame();

          }

 

-상속으로 사용

1
2
3
4
5
6
7
8
9
10
11
12
import javax.swing.*;
 
public class MainWindow extends JFrame{
 
    public MainWindow(){
        setSize(800,600);
        setVisible(true);
    }
    public static void main(String[] args){
        new MainWindow();
    }
}
cs

 

-포함클래스로 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.awt.Color;
import javax.swing.*;
 
public class MainWindow{
    JFrame f=new JFrame();
    public MainWindow2(){
        f.setSize(800,600);
        f.setVisible(true);
    }
    public static void main(String[] args){
        new MainWindow();
    }
}
cs

 

 

3. 수정, 추가: 다형성

오버로딩: 새로운 기능 추가
→new
오버라이딩: 기존에 있던 기능 수정
modify
메소드명 동일 메소드명 동일
메소드 매개변수의 개수나 데이터형이 다름 메소드 매개변수가 동일
리턴형 관계X 리턴형 동일
같은 클래스 내에 존재 상속 받은 상태에서 가능
정적 바인딩(정해진 것 처리) 동적 바인딩(실시간 처리)
  접근지정어 확장 가능, 축소 불가

 

댓글