Chapter 06 클래스

손은영·2022년 3월 16일
1

Java

목록 보기
1/3
post-thumbnail

Java 혼공자로 공부합니당! (eclipse 사용)



객체(Object)란?

→ 자신의 속성을 가지고 있으면서 식별 가능한 것

→ 속성과 동작으로 구성 = 필드와 메소드라고 할 수 있다.

객체의 상호작용

메소드(method)

💡 리턴값 = 객체.메소드(매개값1, 매개값2, ...);

객체 간의 관계

객체는 대부분 다른 객체와 관계를 맺고 있다.

관계의 종류에는 집합 관계, 사용 관계, 상속 관계가 있다.




클래스(Class)

자동차를 만들 때 처음에 설계도를 보고 만들 듯이,

객체를 만들고 싶으면 우선 설계도를 보며 객체를 만드는 작업이 필요하다.

이때 이 설계도를 클래스라고 부를 수 있다.

클래스에는 필드(field)와 메소드(method)가 정의되어 있고,

클래스로부터 만들어진 객체가 해당 클래스의 인스턴스(instance)이다.

클래스 구성 멤버

  1. 필드
  2. 생성자
  3. 메소드

객체 지향 프로그래밍 개발 단계

  1. 클래스 설계
  2. 클래스를 가지고 객체 생성
  3. 객체 이용

**클래스 이름

⇒ 통상적으로 첫 글자는 영어 대문자로

클래스 선언

public class 클래스이름 {

}

객체 생성

// 객체 생성
new 클래스();

// 클래수 변수 선언과 객체 생성
클래스 변수 = new 클래스 ();

생성자: 클래스() ⇒ 메모리 힙(heap)에 생성됨

new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴




필드(Field)

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

  • 필드 선언

생성자 선언과 메소드 선언의 앞 뒤 어느 곳이든 선언 가능(단, 내부만 안됨)

💡 타입 필드 [ = 초기값 ] ;

필드 선언 예시

String company = "현대자동차";
String model = "그랜저";
int maxSpeed = 300;
int productionYear; // 자동으로 기본 초기값으로 설정됨
int currentSpeed;
boolean engineStart;



생성자(Constructor)

  • new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당 객체 초기화: 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비 하는 것
  • 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 X
  • 힙(heap)영역에 객체 생성 → 객체 번지 리턴
  • 리턴된 번지는 클래스 변수에 저장됨
  • 모든 클래스는 생성자가 반드시 존재(하나 이상) → 선언을 생략했다면 바이트 코드에 기본 생성자 자동으로 추가

생성자 오버로딩(overloading)

  • 다양한 방법으로 객체를 생성할 수 있도록
  • 매개변수를 달리하는 생성자를 여러 개 선언
public class Car {
	Car() {}
	Car(String model) {}
	Car(String model, String color) {}
	Car(String model, String color, int maxSpeed) {}
}

다른 생성자 호출: this()

  • 생성자 오버로딩이 많아질 경우 중복된 코드가 발생할 수 있음 (매개변수의 수만 다르고 필드 내용이 비슷한 경우)
  • 한 생성자에게만 집중적으로 작성하고 나머지는 this()코드로




메소드(Method)

리턴타입 메소드이름 (매개변수1, 매개변수2, ...) {
	// 메소드 실행 블록
}

메소드 오버로딩(overloading)

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
  • 하나의 메소드 이름으로 여러 기능을 담음
  • 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
  • 메소드 오버로딩이 필요한 이유
    → 매개값을 다양하게 받아 처리할 수 있도록 하기 위함
  • 오버로딩된 메소드를 호출할 경우 JVM이 매개값을 보고 자동으로 메소드 선택



인스턴스 멤버와 정적 멤버

  • 인스턴스 멤버: 객체마다 가지고 있는 멤버
  • 정적 멤버: 클래스에 위치시키고 객체들이 공유하는 멤버

인스턴스(instance) 멤버

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

인스턴스 멤버 선언

public class Car {
	// 필드
	int gas;

	// 메소드
	void setSpeed(int speed) { }
}

this

// 매개변수 model의 값을 필드 model에 저장
Car(String model) {
	this.model = model;
}

void setModel(String model) {
	this.model = model;
}

정적(static) 멤버

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

정적 멤버 선언
public class 클래스 {
	// 정적 필드
	static 차입 필드 [=초기값];

	// 정적 메소드
	static 리턴 타입 메소드(매개변수 선언) { }
}

<필드를 선언할 때>

객체마다 가지고 있어야 할 데이터 ⇒ 인스턴스 필드

객제마다 가지고 있을 필요가 없는 공용 데이터 ⇒ 정적 필드


<메소드 선언할 때>

인스턴스 필드를 포함하고 있다면 ⇒ 인스턴스 메소드

인스턴스 필드를 포함하고 있지 않다면 ⇒ 정적 메소드

‼️정적 메소드 선언 시 주의할 점‼️

  • 정적 메소드를 선언할 때는 내부에 인스턴스 필드나 메소드를 사용할 수 X
  • this 키워드도 사용 불가❗️
public class ClassName {
	// instance field and method
	int field1;
	void method1() {}
	
	// static field and method
	static int field2;
	static void method2() {}

	// static method
	static void Method3() {
		this.field1 = 10; // (X) compile error
		this.method1();   // (X) compile error
		field2 = 10;
		method2();
	}
}

⬇️

인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근

static void Method3() {
	ClassName obj = new ClassName();
	obj.field1 = 10;
	obj.method1();
}



싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우
  • 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 → private 접근 제한자 붙여주기

싱글톤 만들기

public class 클래스 {
	// static field
	private static 클래스 singleton = new 클래스();

	// constructor
	private 클래스() {}

	// static method
	static 클래스 getInstance() {
		return singleton;
	}
}



final 필드

  • 초기값 = 최종값, 프로그램 실행 도중에 수정할 수 X

final 필드 선언

💡 final 타입 필드 [= 초기값];

final 필드의 초기값은 필드 선언할 때와 생성자에서 주는 방법 2가지!




### 상수(constant, static final)
  • 불변의 값(ex. 원주율, 지구의 무게 및 둘레 등)
  • 객체마다 저장할 필요가 없는 공용성을 가지고 있음
  • 객제마다 존재하지 않고 클래스에만 존재
  • 한 번 초기값이 저장되면 변경할 수 X
  • 상수 이름은 모두 대문자로 작성하는 것이 관례
💡 static final 타입 상수 = 초기값;
profile
정글에서 살아남기

0개의 댓글