Programming Language/JAVA (2) - 혼공자
[Java 혼자 공부하는 자바] 객체 지향 프로그래밍
나수비니
2023. 9. 23. 17:36
728x90
이 파트 공부 하면서 카타르시스 느꼈다....
객체 지향 프로그래밍 (OOP, Object-Oriented Programming)
- 핵심 키워드
- 클래스, 객체, new 연산자, 클래스 변수, 인스턴스, 클래스 멤버
- 핵심 포인트
- 객체의 개념과 객체의 상호작용에 대해 알기
- 클래스로부터 객체를 생성하고, 변수로 참조한다
객체 지향 프로그래밍
- 객체지향프로그래밍이란?
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 ‘객체’들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임 중 하나이다.
- 프로그래밍에서 필요한 데이터를 추상화시켜 상태(속성, 어트리뷰트)와 행위(메서드)를 가진 객체로 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 방법.
- 머리가 핑핑돈다. 뭐라고 설명해야 하지, 퍼즐이 맞춰지는 기분?…
- 특징
- 객체 지향 프로그래밍에서는 모든 데이터를 **객체(objective)**로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 된다.
- 객체(objetive)란 간단히 이야기하면 실생활에서 우리가 인식할 수 있는 사물로 비유할 수 있다.
- 객체를 만들어 내기 위한 설계도와 같은 개념을 **클래스(class)**라고 한다.
객체 지향 프로그래밍의 특징
추상화(Abstraction)
객체에서 공통된 속성과 행위를 추출해 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
- 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기 보다는, 클래스를 설계하는 것 자체를 의미한다. 즉, 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
- 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만든다.
캡슐화(Encapsulation)
객체의 필드와 메서드를 묶고, 실제 구현 내용은 감추는 것이다.
객체 지향 프로그래밍에서 기능과 특성의 모음을 “클래스”라는 “캡슐”에 분류해서 넣는 것
- 외부 객체는 객체 내부의 구조를 알 수 없으며, 객체가 노출해서(ex.public) 제공하는 필드와 메소드만 이용할 수 있다.
- 필드와 메소드를 캡슐화 하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위함.
- 캡슐화의 목적 2가지는?
- 코드를 재수정 없이 재활용하는 것
- 접근 제어자를 통한 정보 은닉
상속(inheritance)
클래스의 상속은 부모 클래스의 멤버(필드, 메서드, 내부 클래스)를 내려받아 자식 클래스 내부에 포함시키는 것.
자식 클래스에선 부모 클래스의 속성과 기능을 이어받아 사용할 수 있다.
- 상위(부모) 객체의 필드와 메서드를 하위(자식) 객체에게 물려준다.
- 부모 객체의 필드와 메서드를 상속받은 자식의 객체에서 그대로 사용할 수 있다.
- 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있다.
- 하위 객체는 상위 객체를 확장해서 추가적인 필드와 메서드를 가질 수 있다.
- 일반적으로 상위 객체는 종류, 하위 객체는 구체적인 사물에 해당한다.
- 자식 클래스를 선언할 때, 어떤 부모 클래스를 상속받을 것인지 결정한다.
- 부모(parent class, super class / 상위 클래스)
- 해당 클래스에 선언된 변수와 함수를 물려주는 클래스
- 자식(child class, sub class / 하위 클래스)
- 다른 클래스로부터 물려받고자 하는 클래스
- 상속의 효과
- 반복된 코드의 중복을 줄임
- 유지 보수의 편리성 제공
- 클래스의 다형적 표현 가능
다형성(polymorphism)
같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것이다.
- 코드 측면에서 보면, 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
- 부모 타입에는 모든 자식 객체가 대입
- 인터페이스 타입에는 모든 구현 객체가 대입
- 효과: 객체를 부품화시키는 것이 가능, 유지 보수가 용이
객체 지향 프로그래밍의 장단점
장점
- 코드 재사용 용이
- 유지 보수 쉬움
단점
- 처리속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있음
- 설계시 많은 시간과 노력이 필요
클래스
- 설계도. 즉, 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
객체
- 클래스에 선언된 모양 그대로 생성된 실체, ‘클래스의 인스턴스’. 즉, 사용할 수 있는 실체이다.
- 물리적으로 존재하거나, 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것
객체의 속성
- 필드 (Filed) + 동작 메소드(method)로 구성
인스턴스 (instance, 객체)
- 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체
- 즉, 객체를 소프트웨어에 실체화 하면 그것을 인스턴스라고 부른다.
- 실체화된 인스턴스는 메모리에 할당된다.
- 인스턴스 특징
- 인스턴스는 객체에 포함된다고 볼 수 있다.
- oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때, ‘인스턴스’라고 부른다.
- 추상적 개념과 구체적 객체 사이의 관계에 초점을 맞출 경우에 사용한다.
- ‘~의 인스턴스’ 의 형태로 사용된다.
- 객체는 클래스의 인스턴스다.
- 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스다.
- 실행 프로세스는 프로그램의 인스턴스다.
클래스, 객체, 인스턴스의 차이
- 클래스(Class) vs 객체(Objective)
- 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.
- 객체(Objective) vs 인스턴스(Instance)
- 클래스의 타입으로 선언되었을 때 → 객체 → 그 객체가 메모리에 할당되어 실제 사용될 때 → 인스턴스