본문 바로가기
JAVA

이것이 자바다 6장 클래스 정리 #1

by mingutistory 2020. 3. 26.
728x90

객체 : 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것. 객체는 속성(=필드)과 동작(=메소드)으로 구성되어 있다. 

 

객체 모델링 : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것. 

 

- 객체들은 독립적으로 존재함. 객체들 사이의 상호작용 수단은 메소드의 호출을 통해 이루어지며 매개값과 리턴값을 통해서 데이터를 주고 받음.

 

객체 간의 관계 : 

- 집합 관계 : 하나는 부품, 하나는 완성품.  (엔진/타이어/핸들 - 자동차)

- 사용 관계 : 객체 간의 상호작용. 다른 객체의 메소드 호출을 통해 원하는 결과 얻어냄. 

- 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계 (기계 - 자동차/컴퓨터)

 

객체 지향 프로그래밍 (OOP) : 만들고자 하는 완성품인 객체를 모델링 > 집합 관계에 있는 부품 객체, 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법.

- 특징 : 캡슐화, 상속, 다형성

 

캡슐화 : 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것. 접근 제한자를 이용해 필드와 메소드의 사용 범위를 제한, 외부 객체는 객체의 내부 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용 할 수 있음. 

why ? 객체의 잘 못된 사용 방지.

 

상속 : 상위 객체가 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용 할 수 있도록 하는 것.

why ? 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계 할 수 있도록 함. 이미 잘 개발된 객체를 재사용하므로 코드의 중복을 줄여줌. 

 

다형성 : 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 하는 것. 

- 부모 클래스 또는 인터페이스의 타입 변환 가능. 부모 타입에 모든 자식 객체 대입 가능, 인터페이스 타입에 모든 구현 객체 대입 가능.

why ? 객체의 부품화를 위해. 

 

인스턴스(instance) : 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함. 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있음. 

 

java 파일 : 사람이 작성한 파일. 컴퓨터는 이해 할 수 없으므로 컴파일러가 필요. 

class 파일(바이트 파일) : 기계어로 변환하기 전 단계 파일. 이클립스에서 컴파일과 동시에 클래스 파일을 생성시켜줌. 바로 기계어로 전환 할 수 있는 파일은 아니고, 쉽게 변환 가능하다.

- 두 개 이상의 클래스가 선언된 소스 파일(java 파일)을 컴파일하면 바이트 코드 파일(class 파일)은 클래스를 선언한 개수만큼 생긴다. 

- 파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다. 

 

객체 생성 과정

- new 연산자 이용. new 생성자() 형태 : 힙 영역에 객체를 생성시킨 후, 객체의 주소를 리턴함. 

- 생성된 객체는 메모리 힙(heap) 영역에 생성

- 생성된 객체를 사용하기 위해서 참조 타입인 클래스 변수에 객체의 주소 리턴. 

- 같은 클래스로부터 생성되었지만 각각의 객체는 자신만의 고유 데이터를 가지면서 메모리에서 활동함. 

 

클래스의 2가지 용도

1. 라이브러리용 : 다른 클래스에서 이용할 목적으로 설계

2. 실행용 : 하나의 클래스. 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할

 

클래스의 구성 멤버 1. 필드 2. 생성자 3. 메소드

1. 필드 (Field) : 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳. 필드 != 변수. 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재. 변수는 생성자와 메소드 내에서만 사용. 

- 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳. 

- 필드는 생성자와 모든 메소드에서 사용 가능.

- 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 함. 

 

2. 생성자 : new 연산자로 호출되는 클래스. 객체 생성 시 초기화를 담당. 필드 초기화, 메소드 호출하여 객체를 사용할 준비 함. 

- 리턴 타입이 없고 클래스 이름과 동일 함. 

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

- 기본 생성자 : 클래스 내부에 생성자 선언을 생략한 경우 자동 추가되는 생성자. 하지만 명시적으로 선언한 생성자가 한 개라도 있으면 기본 생성자는 추가되지 않음. 

- 클래스에 생성자가 명시적으로 선언되어 있을 경우 반드시 선언된 생성자를 호출해서 객체를 생성해야 함. 

- 생성자의 역할 중 하나인 필드 초기화를 하는 2가지 방법

   1) 필드 선언 할 때 초기값을 줌 : 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 가짐.

   2) 생성자에서 초기값을 줌 : 다양한 값들로 초기화 가능.

- 생성자의 매개 변수 이름은 초기화시킬 필드 이름과 비슷하거나 동일한 이름 사용 

   : 동일한 이름 사용시 생성자 내부에서 필드에 접근 할 수 없음. 동일한 이름을 가진 매개 변수가 사용 우선순의가 더 높음. 

   : this.필드명 = 매개변수명 을 이용해서 초기화 가능. 

  * this : 객체 자기 자신의 참조

- 중요한 필드 몇개만 매개변수를 통해 초기화 / 나머지 필드들은 필드 선언 시에 초기화하거나 생성자 내부에서 임의의 값 또는 계산된 값으로 초기화 함. 

- 생성자 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언 하는 것. 

  : 타입, 개수, 순서가 달라야 함.

- 다른 생성자 호출(this()) : 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드를 방지 하기 위해 사용하는 메소드. 자신의 다른 생성자를 호출하는 코드. 생성자의 첫줄에서만 허용.  this(매개변수1, 매개변수2) 이런 식으로 사용.

 

 

 

3. 메소드 : 객체의 동작. 객체 간의 데이터 전달의 수단으로 사용. 외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있음. 

- 메소드의 매개 변수의 수를 모르는 경우 매개 변수를 배열 타입으로 선언함. 넘겨줄 때 배열 타입으로 넘겨 줌.  

> int sum(int … values)로 선언 된다면 메소드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성됨.

- return문이 실행되면 메소드는 즉시 종료 됨. 이후의 실행문은 결코 실행되지 않음. 

- 리턴값이 없는 메소드에서 return을 사용하면 메소드 실행을 강제로 종료 시킴. 

- 메소드 오버로딩.

 

오버로딩 : 매개 변수를 다르게 해서 같은 생성자 혹은 메소드라고 해도 다른 결과 값을 내보내게 하는 것. 

- 타입, 개수, 순서가 달라야 함. 

- 같은 타입, 개수, 순서에 리턴 값만 다르다고해서 오버로딩이 되는 것이 아님. 

 

인스턴스 멤버 : 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드. 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다. 

정적 멤버(static) = 클래스 멤버 : 클래스에 고정된 멤버, 객체를 생성하지 않고 사용할 수 있는 필드와 메소드. 

- static 키워드를 추가적으로 붙여 사용. 

- 인스턴스, 정적 필드 판단 기준 : 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드, 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언. 

- 인스턴스, 정적 메소드 판단 기준 : 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드, 이용하지 않는 다면 정적 메소드. 

- 클래스.필드 / 클래스.메소드(매개값) 형식으로 바로 사용 가능. 참조 변수로도 접근 가능하지만 정적 필드는 클래스 이름으로 접근하는 것이 좋음. 

- 정적 초기화 블록 static {} : 클래스가 메모리로 로딩 될 때 자동적으로 실행 됨. 

- 객체 생성을 하지도 않고 사용 할 수 있기 때문에 인스턴스 필드, 인스턴스 메소드를 내부에서 사용 할 수 없음. 객체를 먼저 생성하고 참조 변수로 접근 해야함.

 

300x250

'JAVA' 카테고리의 다른 글

블랙잭 게임 코드 피드백 #2  (0) 2020.03.29
이것이 자바다 6장 클래스 정리 #2  (0) 2020.03.27
블랙잭 게임 코드 피드백 #1  (0) 2020.03.25
블랙잭 게임 구현 #2 (+코드 공유)  (0) 2020.03.18
블랙잭 게임 구현 #1  (0) 2020.03.17

댓글