객체지향의 특징

Dami·2023년 10월 19일
0

JAVA

목록 보기
1/5
post-thumbnail

객체

학생, 교수, 회원 같이 추상적인 데이터의 단위

ex) 학교 가는 길에 컴포즈에 들려 아이스아메리카노를 샀다.
(bold 의미 : 객체)
여기서 아이스아메리카노 객체의 상태와 행동을 살펴보면

상태 : 가격, 온도, 사이즈, 재료 등,,
행동 : 마시다, 만들어진다, 부어진다 등,,

객체지향 프로그래밍

1) 객체를 먼저 정의하고
2) 객체에 해당하는 기능을 구현하고
3) 객체들끼리 연결(협력..?)을 구현

1. 추상화

쉽게 말하면 복잡한 걸 핵심만 추려서 단순화 하는 과정이라 할 수 있다.
예를 들면 자동차를 운전할 때 운전자가 부품이 어떤 식으로 있는지, 어떻게 작동 되는지 몰라도 !!
↳ 시동, 핸들, 브레이크 등으로 간단하게 구동시킬 수 있음.

즉, 불필요한 세부 정보를 숨기는 것

코드 예시
강의실 정보 중 청소시간은 학생들이 알지 않아도 된다!

public class Classroom {
    public String roomNumber = "101";    // 강의실 번호
    public String location = "1층";     // 강의실 위치
    private String cleaningTime = "오전 7시"; // 강의실 청소 시간 (학생들에게는 숨겨진 정보) => 추상화!

    // cleaningTime은 private이므로, Classroom 클래스 외부에서는 접근 불가!!
}

public class Main {
    public static void main(String[] args){
        Classroom class101 = new Classroom();
        
        System.out.println("강의실 번호: " + class101.roomNumber);
        System.out.println("강의실 위치: " + class101.location);
        // 청소 시간 정보는 출력되지 않음
    }
}

2. 캡슐화

객체의 중요한 데이터나 로직을 외부에서 직접 접근하거나 변경하지 못하도록 보호하는 것.

HOW? private(접근 제한자) 이용해서!
▶ 외부에서는 특정 메서드를 통해서만 내부 데이터에 접근하거나 수정할 수 있게 된다.

Why?
객체의 내부 로직이나 데이터가 변경되어도 외부에서 사용하는 인터페이스는 변하지X ⇨ 코드의 안정성 유지 가능!!

정리!
객체의 내부 구조와 데이터를 숨기고, 외부에서 접근을 제어하는 방법을 제공!!
⇨ 객체의 독립성을 강화 & 코드 유지 보수 쉽게!

코드 예시
학생 정보 : 이름, 학번
위 정보들은 무분별하게 변경되거나 접근하면 안됨!!
⇨ 캡슐화를 통해서 보호!!

public class Student {
    // private 설정 => 외부에서 직접 접근 X
    private String name;
    private String studentID;
    
    // 생성자
    public Student(String name, String studentID) {
        this.name = name;
        this.studentID = studentID;
    }

    // 이름을 가져오는 메서드
    public String getName() {
        return name;
    }

    // 이름을 설정하는 메서드
    public void setName(String name) {
        this.name = name;
    }
    
    // 학번을 가져오는 메서드
    public String getStudentID() {
        return studentID;
    } // 학번은 한 번 설정하면 변경되면X
}

조회도 직접하는게 아닌 getName, getStudentID 를 통해서 가능하고
이름 변경도 직접 데이터에 접근하는 것이 아닌 setNamed을 통해서 가능

3. 상속

이미 존재하는 클래스의 기능과 속성을 받아와서 사용할 수 있는 것.

즉, 동물의 공통 특징을 Animal 클래스에 정의한다면?
Dog 라는 새로운 클래스를 만들 때 Animal 클래스를 상속 받아서 동물의 공통적인 속성과 기능을 사용할 수 있다.

코드 예시
공통 - 학생 Class
상속 받는 애 - 복수전공 학생 Class

// 부모 클래스 - 학생 
class Student { 
    public void majorLesson() {
        System.out.println("학생이 전공 수업을 듣습니다.");
    }

    public void library(){
        System.out.println("학생이 도서관을 이용합니다.");
    }
}

// 자식 클래스 - 복수 전공 학생
class DoubleMajorStudent extends Student {
    // 복수전공만의 특별한 행동
    public void DoubleMajorLesson() {
        System.out.println("학생이 복수 전공 수업을 듣습니다.");  
    }
}


public class Main {
    public static void main(String[] args){
        DoubleMajorStudent yedam = new DoubleMajorStudent();
		// 부모클래스도 정상 출력
        yedam.majorLesson(); //학생이 전공 수업을 듣습니다.
        yedam.library(); //학생이 도서관을 이용합니다.

        // 자기 클래스도 정상 출력
        yedam.DoubleMajorLesson();//학생이 복수 전공 수업을 듣습니다.
    }
}

4. 다형성

서로 다른 객체가 같은 기능을 수행하는 것을 의미.

즉, 동물을 예시를 들면 Animal class에 eat() method가 있을때
초식동물의 eat()을 호출하면 식물을 먹는다
육식동물의 eat()을 호출하면 고기를 먹는다

즉, 같은 method를 호출하지만 참조하는 객체에 따라 다른 결과가 나옴!

코드 예시

  • 기본 클래스 - 넓이 반환
  • 삼각형 클래스 - 넓이 반환 : 삼각형 넓이 계산 및 반환
// 부모 클래스: 도형
class Shape {
    // 도형의 넓이를 반환하는 메서드 (이 예에서는 기본 도형이므로 구체적인 계산은 하지 않습니다.)
    double getArea() {
        return 0.0;
    }
}


// 자식 클래스: 삼각형
class Triangle extends Shape {
    private double lenght;   // 밑변
    private double height; // 높이

    Triangle(double lenght, double height) {
        this.lenght = lenght;
        this.height = height;
    }

    @Override
    double getArea() {
        return 0.5 * lenght * height; // 삼각형의 넓이 = 0.5 * 밑변 * 높이
    }
}

public class Main {
    public static void main(String[] args){
        Shape s1 = new Shape(); // 부모클래스
        Shape s2 = new Triangle(10, 5);  // 밑변 10, 높이 5인 삼각형

        System.out.println("기본 도형의 넓이: " + s1.getArea());   // 출력: 0.0
        System.out.println("삼각형의 넓이: " + s2.getArea());      // 출력: 25.0
    }
}

헷갈렸던 점

1) 추상화와 캡슐화

  • 추상화 : 복잡한 내용, 기능, 객체 등을 단순화해서 핵심적인 부분만 표현하는 것.
  • 캡슐화 : 중요한 데이터나 복잡한 내부 구조 숨기고 only 정의된 인터페이스를 통해서만 접근할 수 있는 것.

강의 정보에
교수 정보 - 이름, 연구실 정보(석박사 인원, 연구실 위치 등), 전화번호, 주소

추상화 : 사용자에게 필요한 기능만 제공하도록 설계하는 것.
           즉, 교수 이름만 제공하는 것.
            why? 강의 정보를 보는 학생들은 교수 이름을 제외하곤 몰라도 상관X

캡슐화 : 교수의 전화번호나 주소를 숨기는 것.
            why? 개인정보(중요한 데이터)이기 때문에 숨겨야 함.

2) 상속과 다형성
도형을 예시로 들면

  • 상속 : 삼각형은 도형이다. ⇨ 삼각형은 도형의 상속을 받음
  • 다형성 : 도형 class에서 '넓이 구하기' method가 있을 때
               각 도형은 각각 다른 방식으로 이 method를 override해서 넓이 계산
    • 삼각형: 0.5 x 밑변 x 높이
    • 사각형: 가로 x 세로
    • 원: π x 반지름 x 반지름

어떤 특징이 가장 중요할까?

각 특징 별로 각각 중요한 역할을 하기 때문에 어떤 하나가 가장 중요하다곤 할 수 없겠지만,,
안정성 측면에서 반드시 필요한 게 캡슐화이기에 외부로부터 데이터를 보호하고 객체를 숨기는 부분에서 캡슐화의 중요성이 크게 느껴지는 것 같다.

0개의 댓글

관련 채용 정보