과제를 수행하다 보니 자바 기초가 너무 부족한 것 같아서 다시 한번 개념 정리를 하고 넘어가려 한다.
객체란 무엇이고 클래스는 무엇이며, 필드 생성자 메소드의 역할을 다시 정리해보자.
객체지향 언어
① 객체 지향의 4대 특성
- 캡 - 캡슐화(Encapsulation): 정보 은닉(information hiding)
- 상 - 상속(
Inheritance): 재사용 - 추 - 추상화(Abstraction): 모델링
- 다 - 다형성(Polymorphism): 사용 편의
※ 객체 지향 프로그래밍은 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다.
② 클래스의 정의
- 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념
- 자바에서는 설계도가 클래스이다.
- 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
③ 객체의 정의 : 세상에 존재하는 유일무이한 사물
-> 세상에 존재하는 유일 무이한 객체를 특성(속성+기능)에 따라 분류해 보니 객체를 통칭할 수 있는 집합적 개념, 클래스(분류)가 나오게 된다.
④ 추상화 : 구체적인 것을 분해해서 관심 영역(애플리케이션 경계 Application Boundary)에 있는 특성만 가지고 재조합하는 것 = 모델링
- OOP의 추상화는 모델링이다.
- 클래스 : 객체 = 사람 : 김연아 = 펭귄 : 뽀로로
- 클래스 설계에서 추상화가 사용된다.
- 클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
- 객체 지향에서 추상화의 결과는 클래스이다.
더 확장해서 추상화를 본다면 다음과 같이 볼 수 있다.
- 상속을 통한 추상화, 구체화
- 인터페이스를 통한 추상화
- 다형성을 통한 추상화
⑤ 클래스의 구성 멤버
1. 필드 : 객체의 속성을 의미한다.
- 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
- 선언 형태는 변수와 비슷하지만, 필드를 변수라고 하지 않는다.
- 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸되지만 필드의 경우 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체외 함께 존재한다.
2. 생성자 : 객체 생성 시 초기화 담당
- 생성자는 new 연산자로 호출되는 특별한 중괄호{} 블록이다.
- 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
- 생성자는 메소드와 비슷하게 생겼지만 클래스 이름으로 되어 있고 리턴 타입이 없다.
3. 메서드 : 객체의 동작을 의미한다.
- 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.
- 메소드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다.
- 메소드는 객체 간의 데이터를 전단하는 수단이다.
- 외부로부터 매개값을 받아 실행에 이용하고, 실행 후 결과 값을 외부로 리턴할 수도 있다.
오버로딩 오버라이딩
객체 지향에서 다형성이라고 하면 오버라이딩(Overriding)과 오버로딩(Overloading)이라고 할 수 있다.
- 다형성 : 사용편의성
- 오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
- 오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
변수와 메모리 구조
T메모리는 스태틱 영역, 스택 영역, 힙 영역으로 구성된다.
- 지역 변수는 스택 영역에서 일생을 보낸다. 그것도 스택 프레임 안에서 일생을 보내게 된다. 따라서 스택 프레임이 사라지면 함께 사라진다.
- 클래스 멤버 변수는 스태틱 영역에서 일생을 보낸다. 스태틱 영역에 한번 자리 잡으면 JVM이 종료될 때까지 고정된(static)상태로 그 자리를 지킨다.
- 객체 변수는 힙에서 일생을 보낸다. 객체 멤버 변수들은 객체와 함께 가비지 컬렉터라고 하는 힙 메모리 회수기에 의해 일생을 마치게 된다.
전역변수 사용을 지양하는 이유
- 전역 변수는 코드 어느 곳에서나 접근할 수 있다고 해서 전역 변수라고 하고, 여러 메서드들이 공유해서 사용한다고 해서 공유 변수라고도 한다.
- 프로젝트 큐모에 따라 모드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 시작하면 T메모리로 추적하지 않는 이상 전역 변수에 저장돼 있는 값을 파악하기 쉽지 않다.
- 따라서 최대한 전역 변수는 피할 수 있다면 피해야할 존재이다.
- 대신 잃기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 좋은 방법이다. 대표적인 예로 원주율을 나타내는 PI가 있다.
참고 자료 :
<스프링 입문을 위한 자바 객체 지향의 원리와 이해> 김종민 지음
<혼자 공부하는 자바> 신용권 지음
'Coding > Java' 카테고리의 다른 글
[29] JAVA 스레드 제어 (0) | 2022.12.21 |
---|---|
[28] JAVA 멀티스레드 (0) | 2022.12.21 |
[26] JAVA 익명 객체 (Anonymous) (0) | 2022.12.10 |
[25] JAVA 중첩 클래스/ 중첩 인터페이스 (0) | 2022.12.09 |
[24] JAVA 타입 변환과 다형성 (0) | 2022.12.06 |