상세 컨텐츠

본문 제목

JAVA 6-1. 객체지향 프로그램(객체, 클래스- 필드, 생성자, 메소드)

Backend/JAVA-자바

by 사랑짱 2021. 5. 21. 08:41

본문

 

 

OOP (Object-Oriented Programming)

- 쉽게 말해 부품 객체를 먼저 만들고 이것들을 하나씩 조립해 완성된프로그램을 만드는 기법

 

아래 OOP에 대한 큰 틀을 정리해 놓은 링크를 참고하자!

 

▼▼▼▼▼

 

[개-발/JAVA] - JAVA. OOP - 객체지향프로그래밍

 

 

지금부터 OOP와 관련된 여러 개념에 대해 알아보자!!


◆ 객체 (Object) 란?

- 현실에 존재하는 실체가 인간의 사고과정을 통해 머리 속에 정리된 개념

- 쉽게 말해 자신의 속성동작/기능을 가지는 모든 것을 의미

실체 : 개미
객체의 속성 : 이름은 개미, 까맣고 매우 작다, 다리는 여섯개 등
객체의 동작 : 먹이를 먹는다. 부지런이 돌아다닌다. 등

 

※ 모든 객체는 필드(속성)와 메소드(동작)로 구성된 자바 객체로 모델링 가능하다!

※ 객체들을 서로 간에 기능(동작)을 이용하고 데이터를 주고 받는다!! 기브앤 테이크!!interaction!!

 

 

객체가 되기 위해서는?

- 상태(status) : 객체를 설명하는 특성, 속성을 의미

- 잘 정의된 행위(well-defined behavior) : 객체가 할 수 있는 일을 의미(기능적인 측면)

- 유일한 식별자(unique identity) : 다른 객체와 구분할 수 있게 하는 자신만의 고유한 구분인자를 의미

 

 

◆ 객체 간의 관계

-  객체 지향 프로그램에서는 객체는 다른 객체와 관계를 맺음

 

※ 관계의 종류

1. 집합 관계 : 완성품 - 부품(is has 관계)의 관계 ( ex.자동차 - 엔진, 타이어, 핸들)

2. 사용관계 : 객체가 다른 객체를 사용하는 관계 ( ex. 사람 - 자동차 )

3. 상속 관계 : 종류 객체(is A 관계)와 구체적인 사물 객체 관계 ( ex. 기계 - 자동차)

 

 


 

 

◆ 클래스(Class)란?

- 객체를 만들어내기 위한 설계도 혹은 틀

- 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의

- 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다!!

 

※ 클래스로부터 만들고자 하는 것, 만들어진 것이 객체(결과)이며,

   클래스로부터 만들어진 객체는 인스턴스(과정)라고한다.

 

<참고> Object / Instance 비교

- Object(객체) : 소프트 세계에 구현할 대상/ 객체는 모든 인스턴스를 대표하는 포괄적인 의미
- Instance(인스턴스) : 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체

클래스 타입으로 선언되었을 때 객체라고 부르고,
그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
객체는 현실세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
객체는 '실체', '인스턴스는 '관계'에 초점을 맞춘다.

 

<참고> 클래스 선언과 컴파일

- 소스 파일 생성: 클래스이름.java
- 소스 작성 -> 컴파일(javac) -> 클래스 이름.class(바이트 코드 파일)
- 소스 파일당 하나의 클래스를 선언하는 것이 관례
                   여러 개의 클래스를 선언하는 경우 선언한 개수만큼 바이트코드 파일이 생성
  (단, 소스 파일 이름과 동일한 클래스만 public으로 선언 가능/ public은 최대 하나만 선언 가능)

 

 

◆ 클래스의 분류

 

1. 실행 클래스

- main( ) 메소드를 가지고 있는 클래스로 실행할 목적으로 만든 클래스

main()메소드 : Startup/Entry point   
main()메소드 수행주체 : JVM의 "main" 스레드가 수행시킨다.

 
2. 라이브러리(API: Application Program Interface) 클래스

- 다른 클래스에서 이용할 목적으로 만든 클래스

- main( ) 메소드가 없어 자체적으로 실행되지 않음

 

 

클래스의 구성요소

 

"클래스를 클래스답게 만들려면 어떻게 해야할까?"

 

클래스의 구성요소는 크게 세 가지가 있다.

(1) 필드, (2) 생성자, (3) 메소드

 

 

1. 필드(Field)

- 객체의 데이터가 저장되는 곳

- 클래스 내에 있는 필드는 객체의 속성을 의미할 뿐

  실제 필드는 객체가 생성되면서 함께 생성!!

  (필드는 생성되는 객체마다 다를 수 있기 때문에 정의하기보다 선언하자)

 

※ 필드의 사용

- 객체 내부 - "this.필드이름" 으로 바로 접근/ 객체외부 - "참조변수.필드이름"으로 접근

- 클래스 내에 필드 선언 시 초기값을 지정하지 않으면 자동으로 기본값으로 초기화

  (정수타입 - 0, 실수타입 - 0.0, 논리타입 - false, 참조타입 - null)

- 필드는 객체가 생성될 때 생성되고, 객체가 파괴될 때 함께 파괴된다.

Q. 객체 파괴가 가능한가?
A. 개발자는 제어할 수 없으며, JVM Thread 중 가비지 컬렉터 역할을 하는 Finalizer Thread가 파괴할 수 있다.

 

※ 필드의 내용 

1. 객체의 고유 데이터

2. 객체의 현재 상태 데이터(시점에 따라 변할 수 있는 것)

3. 객체가 가져야 할 부품 객체(집합관계에 있는 부품을 의미함)

 

"기억하자!! 클래스 안에 만들어진 변수는 더이상 변수가 아니다!!

클래스 안에는 필드와 지역변수만 존재한다!!" 

 

 

2. 생성자(Constructor)

Lvalue(클래스 타입의 참조변수 준비) = Rvalue(new 연산자와 생성자로 객체 생성)

 

- new 연산자에 의해 호출되어 객체(인스턴스) 생성 시 초기화 역할을 담당

- 모든 클래스는 생성자가 반드시 존재하며 하나 이상을 가질 수 있음

- 생성자의 이름 - 클래스의 이름은 항상 동일

- 생성자는 일종의 특별한 메소드로 리턴타입을 받지 않음

   (왜? 생성자는 new 연산자가 호출했는데 new 연산자는 결과 값을 받을 수가 없기 때문!)

 

※ 생성자의 종류

1. Default Constructor - 기본 생성자

- 클래스에 생성자가 선언되어 있지 않을 때 javac가 대신 만들어주는 생성자

- 클래스와 동일한 접근제한자로 설정되며 생성자 블록에는 아무것도 입력하지 않는다.

 

2. User-defined Constructor - 사용자 정의 생성자

- 개발자가 초기화해주고 싶은 필드만 매개변수로 입력받아 만든 생성자

- 개발자가 생성자를 직접 만드는 순간 javac는 절대 개입하지 않는다!

 

※  this의 기능

1. new 연산자로 생성된 객체의 레퍼런스를 가지고 있는 것

2. 객체 멤버 참조연산자(도트연산자)를 이용하여 매개변수값과 필드를 구분(이름 충돌 방지)

3. 다른 생성자 호출하는 코드로 생성자의 첫 줄에서만 허용

 

<참고> 생성자 오버로딩(Overloading)

- 매개변수의 타입, 개수, 순서가 다른 생성자 여러 개 선언하는 것
- 생성자가 다양해야 하는 이유? 객체를 생성할 때 외부 값으로 객체를 초기화해야하며
                                          외부값이 어떤 타입으로 몇 개가 제공될지 모르기 때문에 다양화

 

 

3. 메소드(Method) 

- 객체의 동작(기능)을 담당

- 메소드를 호출하면 중괄호 { } 블록 안에 있는 모든 코드들이 일관 실행

 

※ Method Signature : Method의 Header 부분을 의미 

1. 메소드의 이름 

2. 메소드의 매개변수들 

3. 메소드의 리턴타입 

4. 메소드의 접근제한자

5. 예외처리

 

 Method 선언할 때 쓰는 변수의 종류

- Argument : 전달인자 (매개변수로 전달하는 값)

- Parameter : 매개변수(객체의 행위를 실행하기 위해 필요한 변수)

 

※ 메소드의 호출(사용)

- 클래스 내부 - "메소드이름" 으로 바로 호출

- 클래스외부 - 객체 생성 후, "참조변수.메소드이름"으로 접근

 

<참고> 메소드 오버로딩(Overloading)

- 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
- 하나의 메소드의 기능으로 다양한 매개값을 받기 위해 매개변수의 타입, 개수, 순서를 다르게 선언하는 것
   (이때, 리턴타입은 오버로딩의 조건과 무관하다!!)

 

 

 Getter/Setter 메소드

Getter : private 필드의 값을 외부로 호출자에게 반환하는 역할

Setter : 외부에서 전달받은 인자 값을 필드값으로 변경하는 역할

 

※ Getter/Setter의 역할

- 필드의 값을 함부로 접근하지 못하도록 은닉화!

- 필드의 무결성 유지(필드에 넣기 전 알맞은 인자타입인지 확인)

 

Getter/Setter 이름 관례

- Getter : get+필드명

  예외) 필드의 타입이 boolean이라면 is+ 필드명

- Setter : set + 필드명(매개변수 선언부 - 매개변수명을 필드명에 동일)

 

 

관련글 더보기