06 클래스 기초
클래스와 인스턴스
1. 클래스(Class)
클래스는 객체를 만들기 위한 틀 또는 설계도입니다. 클래스는 속성(필드)과 행동(메소드)을 정의하며, 실제 데이터를 가지지 않습니다. 클래스를 정의하고, 그 클래스를 바탕으로 여러 객체를 만들 수 있습니다.
클래스의 구성 요소
필드(Field): 객체가 가지는 데이터(속성)입니다. 예를 들어, 사람 클래스를 만들면
이름
,나이
가 필드가 될 수 있습니다.메소드(Method): 객체가 할 수 있는 동작(기능)입니다. 예를 들어, 사람 클래스에
걷다
,말하다
등의 메소드를 정의할 수 있습니다.
클래스 정의 예시
step1 패키지 안에 작성하세요
위 예시에서 Person
이라는 클래스는 사람의 속성인 name
과 age
를 정의하고, 사람의 동작인 sayHello()
라는 메소드를 정의합니다. 이 클래스는 사람 객체를 만들기 위한 설계도일 뿐, 아직 실제 데이터나 동작은 없습니다.
2. 인스턴스(Instance)
인스턴스는 클래스를 사용하여 실제로 생성된 객체입니다. 즉, 클래스를 기반으로 만들어진 실제 데이터가 포함된 실체입니다. 클래스는 추상적인 개념이지만, 인스턴스는 구체적인 데이터와 행동을 갖는 객체입니다.
인스턴스 생성 방법
클래스를 사용하여 인스턴스를 만들려면 new
키워드를 사용해야 합니다. new
키워드는 클래스의 설계도를 기반으로 메모리에 실제 객체를 생성하는 역할을 합니다.
인스턴스 사용 예시
person1
은Person
클래스를 기반으로 만들어진 하나의 인스턴스입니다.person1.name = "홍길동";
를 통해person1
인스턴스의name
속성에"홍길동"
을 할당하고,person1.age = 30;
을 통해 나이를 설정합니다.person1.sayHello()
를 호출하면, 해당 인스턴스의sayHello()
메소드가 실행됩니다.
클래스와 인스턴스의 차이
정의
객체를 만들기 위한 설계도 또는 청사진
클래스를 기반으로 생성된 실제 객체
역할
객체의 속성과 동작을 정의
정의된 클래스를 바탕으로 실제 데이터를 가짐
메모리
클래스 자체는 메모리를 차지하지 않음
인스턴스는 실제로 메모리에서 공간을 차지함
사용
객체를 정의하는 데 사용
실제 프로그램에서 동작하는 객체
예시를 통한 설명
클래스는 설계도:
Person
클래스는 "사람"이라는 객체를 만들기 위한 틀입니다. 이 클래스만으로는 아무런 데이터나 동작을 할 수 없고, 단지 사람의 이름과 나이, 행동을 정의하는 구조만 가지고 있습니다.인스턴스는 실체:
person1
과person2
는Person
클래스를 기반으로 만들어진 실제 객체입니다. 각각의 인스턴스는 독립적인 데이터를 가지고 있습니다. 예를 들어,person1.name
은"홍길동"
이고,person2.name
은"김영희"
가 될 수 있습니다.
정리
클래스(Class): 객체를 만들기 위한 설계도입니다. 객체가 가져야 할 속성과 행동을 정의합니다.
인스턴스(Instance): 클래스를 사용하여 생성된 실제 객체입니다. 클래스는 추상적이지만, 인스턴스는 구체적인 데이터와 행동을 가집니다.
생성자(Constructor)
생성자(Constructor)는 클래스의 인스턴스를 생성할 때 호출되는 메소드로, 객체의 초기화 작업을 담당합니다. 생성자는 객체가 생성될 때 자동으로 실행되며, 객체의 필드를 초기화하거나 필요한 설정을 수행하는 데 사용됩니다. Java에서 생성자는 클래스와 같은 이름을 가지며, 리턴 타입이 없습니다.
생성자의 기본 개념
클래스와 동일한 이름을 가집니다.
리턴 타입이 없고, 값을 반환하지 않습니다. (심지어
void
도 사용하지 않습니다.)객체가 생성될 때 자동으로 호출되며, 객체를 초기화합니다.
생성자는 매개변수를 가질 수 있으며, 여러 개의 생성자를 정의하는 생성자 오버로딩도 가능합니다.
생성자 생성 단축키
인텔리제이에서 단축키 입력 후
윈도우:
alt
+insert
맥:
command
+N
“생성자” 또는 “Constructor” 클릭하여 생성 가능합니다.
기본 생성자 (Default Constructor)
defaultConstructor 패키지에 생성
Java에서는 기본 생성자라는 특별한 생성자가 있습니다. 기본 생성자는 매개변수가 없는 생성자로, 클래스에 명시적으로 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 제공합니다. 이 생성자는 필드 초기화를 포함한 작업을 하지 않으므로, 객체만 생성됩니다.
위 예시에서 Person
클래스는 기본 생성자를 가지고 있으며, 이 생성자는 name
과 age
필드를 기본 값으로 초기화합니다.
매개변수와 this
생성자는 매개변수를 가질 수 있으며, 이를 통해 객체를 생성할 때 초기 값을 설정할 수 있습니다. 매개변수가 있는 생성자를 사용하면 객체를 생성할 때 원하는 값으로 필드를 초기화할 수 있습니다.
생성자 내부에서는 보통
this
키워드를 사용하여 클래스의 필드를 참조합니다.this
는 현재 객체 자신을 참조하는 키워드입니다. 생성자에서 매개변수의 이름이 필드와 동일할 때, 이를 구분하기 위해this
키워드를 사용합니다.
parameterAndThis 패키지에 생성
this.name
은 Person 객체의 필드 name
을 가리키고, name
은 생성자의 매개변수입니다.
(this.name 은 Person 클래스의 name this.age 는 Person 클래스의 age 를 가리키고있습니다.)
예시에서는 Person
클래스에 매개변수가 있는 생성자를 정의하여, 객체를 생성할 때 이름과 나이를 초기화할 수 있습니다.
생성자 오버로딩
생성자도 메소드처럼 오버로딩이 가능합니다. 즉, 매개변수의 개수나 타입이 다른 여러 개의 생성자를 정의할 수 있습니다. 이를 통해 다양한 방식으로 객체를 생성할 수 있습니다.
예시: 생성자 오버로딩
constructorOverloading 패키지에 생성
위 클래스에서는 기본 생성자와 매개변수가 있는 생성자가 모두 정의되어 있습니다. 이렇게 하면 객체를 생성할 때 매개변수를 제공할 수도 있고, 제공하지 않을 수도 있습니다.
생성자의 역할
객체의 초기화: 생성자는 객체가 생성될 때 필드 값을 초기화하고, 필요한 설정을 처리하는 데 사용됩니다.
다양한 객체 생성 방법 제공: 생성자 오버로딩을 통해 객체 생성 시 다양한 입력값을 받을 수 있어, 객체를 유연하게 생성할 수 있습니다.
의무적 호출: 객체가 생성될 때 반드시 생성자가 호출됩니다. 따라서 생성자를 통해 초기화가 보장됩니다.
정리
생성자는 객체가 생성될 때 호출되어 객체를 초기화하는 역할을 합니다.
기본 생성자는 매개변수가 없으며, 클래스에 별도의 생성자가 정의되지 않으면 컴파일러가 자동으로 제공합니다.
매개변수가 있는 생성자는 객체를 생성할 때 원하는 값을 받아 필드를 초기화할 수 있습니다.
생성자 오버로딩을 통해 여러 개의 생성자를 정의하여 다양한 방식으로 객체를 생성할 수 있습니다.
this
키워드는 생성자 내에서 객체의 필드를 참조할 때 사용됩니다.
클래스의 정적 필드와 정적 메소드
클래스의 정적 필드(static field)와 정적 메소드(static method)는 클래스 자체에 속하는 필드와 메소드를 의미합니다. 일반적으로 클래스의 인스턴스(객체)를 통해 필드와 메소드를 사용하는데, 정적 필드와 메소드는 인스턴스와 관계없이 클래스 자체에 속하며 클래스 이름을 통해 직접 접근할 수 있습니다.
클래스의 정적 필드(static field)
정적 필드는 클래스에 속하는 변수로, 인스턴스마다 따로 존재하는 것이 아니라 클래스 자체에 하나만 존재합니다. 즉, 모든 인스턴스가 동일한 정적 필드를 공유합니다.
정적 필드의 특징
클래스에 하나만 존재하며, 모든 인스턴스가 해당 필드를 공유합니다.
인스턴스가 아닌 클래스 이름으로 접근할 수 있습니다.
클래스 로딩 시 메모리에 할당되며, 프로그램이 종료될 때까지 존재합니다.
정적 필드 선언 예시
staticField 패키지에 생성
위 예시에서 brand
는 HanChicken
클래스에 속하는 정적 필드입니다.
정적 필드 사용 예시
정적 필드는 클래스 이름을 통해 직접 접근할 수 있으며, 인스턴스를 만들지 않아도 사용할 수 있습니다.
정적 필드와 인스턴스 필드 비교
소속
클래스 자체에 소속
각 인스턴스(객체)에 소속
메모리 할당
클래스가 로딩될 때 한 번만 할당
인스턴스가 생성될 때마다 새로 할당
접근 방법
클래스 이름으로 접근 (예: 클래스명.필드명
)
인스턴스를 통해 접근 (예: 객체명.필드명
)
클래스의 정적 메소드(static method)
정적 메소드는 클래스에 속하는 메소드로, 인스턴스가 아닌 클래스 자체에 속합니다. 따라서 클래스 이름을 통해 직접 호출할 수 있으며, 인스턴스 필드나 인스턴스 메소드에 접근할 수 없습니다. 이유는 인스턴스 필드나 메소드는 객체가 생성된 후에 사용할 수 있지만, 정적 메소드는 객체 생성 없이 클래스 단위에서 실행되기 때문입니다.
정적 메소드의 특징
클래스 이름을 통해 호출할 수 있습니다.
인스턴스가 없어도 호출 가능하므로, 객체와 관련 없는 작업을 수행할 때 사용됩니다.
정적 메소드 내에서는 정적 필드나 다른 정적 메소드만 사용할 수 있습니다.
정적 메소드 내에서는
this
키워드를 사용할 수 없습니다. (인스턴스와 관계가 없기 때문)
정적 메소드 선언 예시
staticMethod 패키지에 작성
위 예시에서 contact()
메소드는 정적 메소드입니다. 클래스 이름을 통해 호출할 수 있으며, 클래스의 정적 필드인 brand
에 접근할 수 있습니다.
정적 메소드 사용 예시
정적 메소드는 클래스 이름을 통해 직접 호출되며, 인스턴스를 만들지 않아도 사용할 수 있습니다.
정적 메소드와 인스턴스 메소드 비교
소속
클래스 자체에 소속
각 인스턴스(객체)에 소속
인스턴스 접근 여부
인스턴스 필드나 메소드에 접근할 수 없음
인스턴스 필드와 다른 인스턴스 메소드에 접근 가능
호출 방법
클래스 이름으로 호출
(예: 클래스명.메소드명()
)
인스턴스를 통해 호출
(예: 객체명.메소드명()
)
사용 목적
객체와 관련 없는 작업을 수행할 때 사용
객체의 상태를 조작하거나 관련된 작업을 수행
언제 정적 필드와 메소드를 사용해야 할까?
공통적인 값이나 기능이 필요할 때:
예를 들어, 모든
HanChicken
인스턴스가 같은 브랜드 이름을 공유한다면,brand
필드를 정적 필드로 선언하여 모든 인스턴스가 동일한 값을 공유하도록 할 수 있습니다.
객체의 상태와 무관한 메소드:
인스턴스가 없어도 호출할 수 있는 유틸리티 함수(예: 수학 계산, 문자열 조작 등)는 정적 메소드로 작성하는 것이 적절합니다. 예를 들어,
Math
클래스의Math.pow()
와 같은 메소드는 정적 메소드입니다.
정리
정적 필드는 클래스에 속하는 변수로, 클래스에 하나만 존재하고 모든 인스턴스가 공유합니다.
정적 메소드는 클래스에 속하는 메소드로, 인스턴스와 관계없이 클래스 이름을 통해 호출할 수 있습니다.
정적 메소드에서는 인스턴스 필드와 메소드에 접근할 수 없고, 정적 필드와 정적 메소드만 사용할 수 있습니다.
정적 필드와 메소드는 객체의 상태와 무관한 공통된 값이나 동작을 정의할 때 유용합니다.
Last updated