[JAVA] 객체 지향 프로그래밍
객체 지향 프로그래밍
object-oriented programming : 객체 지향 프로그래밍
자동차 여러 부품을 만들고 조립하는 원리.
부품 객체를 먼저 만들고 이것들을 하나로 조립해 완성된 프로그램을 만드는 기법
객체지향언어
객체지향이론의 기본 개념
실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 물건의 상호작용이다.
객체지향언어는 기존의 프로그래밍 언어와 다른 전혀 새로운 것이 아니라, 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가하여 발전시킨 형태의 것이다. 이러한 규칙들을 이용해서 코드 간에 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성하는 것이 가능해졌다.
객체지향언어의 주요 특징
1. 코드의 재사용성이 높다.
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
객체(object)
- 현실 세계에 존재하는 모든 사물
- 추상적인 것(회사, 날짜) 중에서 자신의 속성과 동작을 가지는 모든 것
- 객체는 필드(속성)과 메소드(동작)로 구성된 자바 객체로 모델링 가능
힙(Heap) 영역
객체를 보관하는 메모리 영역
스택(Stack) 영역
객체의 구성요소: 속성과 기능
일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다. 즉, 객체는 속성과 기능의 집합이다.
클래스로부터 객체를 생성하면 클래스에 정의된 속성과 기능을 가진 객체가 만들어진다.
속성property = 멤버변수member variable, 특성attribute, 필드field, 상태state
기능function = 메서드method, 함수function, 행위behvior
ex) TV
속성: 크기, 길이, 높이, 색상, ...
기능: 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, ...
class TV {
String color;
boolean power;
int channel;
void power() { power != power }
void channelUp() { channel++; }
void channelDown() { channel--; }
}
객체의 상호작용
객체들은 서로 간에 기능(동작)을 이용하고 데이터를 주고 받음
객체 지향 프로그래밍의 특징
캡슐화
- 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것
- 외부 객체는 객체 내부 구조를 알지 못하며 객체가 노출해 제공하는 메소드만 이용 가능
- 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 것임.
- 자바 언어는 캡슐화된 언어를 노출시킬 것인지 숨길 것인지 결정하기 위해 접근 제한자 Access Modifier 사용
상속
- 상위(부모) 객체의 필드와 메소드를 하위(자식) 객체에게 물려주는 행위
- 하위 객체는 상위 객체를 확장해서 추가적인 필드와 메소드를 가질 수 있음
- 상속 대상: 필드와 메소드
- 상속의 효과
* 상위 객체를 재사용해서 하위 객체를 빨리 개발 가능
* 반복된 코드의 중복을 줄임
* 유지 보수의 편리성 제공
* 객체의 다형성 구현
다형성Polymorphism
- 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성실
* 부모 타입에는 모든 자식 객체가 대입
* 인터페이스 타입에는 모든 구현 객체가 대입
-효과
* 객체를 부품화시키는 것 가능
* 유지보수 용이
Class
객체를 정의해놓은 것. 객체의 설계도 또는 틀.
클래스는 객체를 생성하는데 사용되며 객체는 클래스에 정의된 대로 생성된다.
클래스 정의: 객체를 정의해놓은 것
클래스 용도: 객체를 생성하는데 사용된다.
객체: 실제로 존재하는 것.
객체의 정의: 실제로 존재하는 것
객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체: 책상, 의자 등 사물
무형의 객체: 수학공식, 프로그램 에러 같은 논리나 개념
(1) 붕어빵 틀: class
(2) (1)에서 찍어낸 붕어빵이 바로 객체이다.
붕어빵 틀에서는 붕어빵이 나오고, 잉어빵 틀에서는 잉어빵이 나온다. 붕어빵 틀에서 타코야끼가 나오지는 않는다.
1. 자바소스파일(**.java)
2. 컴파일(javac.exe) - > (A.class, B.class)
3. 실행(java.exe) -> JVM 구동
4. 메소드 영역에 저장된 객체(*.class파일의 바이트코드를 저장하고 있는 객체) - > clazz 객체
5. 자바에서 "문자열" 리터럴은 JVM RDA의 HEAP 영역에 한 번만 생성되는 객체로, 자신의 주소를 공유한다.
6. 참조타입 변수 안에 저장된 객체의 주소를 실무에서는 reference(참조)라고 한다.
7. 참조타입 변수에는 객체의 '주소'를 저장. 참조타입 변수의 초기값으로 'null' 사용 가능
null - 객체의 주소를 가지고 있지 않다.
javac구동 - class
클래스파일에 들어있는 바이트 타입을 메소드 영역Method Area에 저장
바이트코드라서 잘 알아볼 수가 없다.
이중 메인 메소드는
method라고 적힌 부분
참조 타입은 무조건 주소가 있다.
같은 주소 = 같은 객체를 만나게 된다.
두 변수가 같은 주소를 가지고 있다.
문자열이 달라지자 참조가 다르다고 표기된다.
임시로 클래스를 만들고
객체를 생성하고 객체의 주소를 확인할 수 있다.
@: at앳, 골뱅이
TTT@372fa8d :: 왼쪽은 객체의 유형(배열, 열거, ...) , 오른쪽은 객체의 주소를 표현한다. 16진수 코드
주소를 가지고 객체를 마음대로 조작할 수는 없다.
@ 우측의 주소는 논리적인 주소이고, 물리적인 주소는 아니다. = 객체의 레퍼런스
null
= 객체의 주소가 없다. 담고 있지 않다.
기본타입 변수의 초기값으로는 사용불가
글자의 길이
null로 입력하면 오류 발생
참고문헌: 이것이 자바다, 자바의 정석