클래스
- 객체를 정의해 놓은 것
- 객체의 설계도 또는 틀
- 객체를 생성하는데 사용됨
클래스를 정의하는 방법
클래스란 객체를 정의한 것이므로, 클래스에는 객체의 모든 속성과 기능이 정의되어 있다.
copy typescriptclass Tv {
// 속성(변수)
String color;
boolean power;
int channel;
// 기능(메서드)
void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
객체
- 실제로 존재하는 것. 사물 또는 개념
- 객체의 용도는 객체가 가지고 있는 기능과 속성에 따라 다름
- 클래스에 정의된 내용대로 메모리에 생성된 것
객체 만드는 방법
인스턴스화
- 클래스로부터 객체를 만드는 과정
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
객체 : 모든 인스턴스를 대표하는 포괄적인 의미
인스턴스 : 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미
객체의 구성 요소
- 속성(property)
- 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
- 기능(function )
- 메서드(method), 함수(function), 행위(behavior)
copy cpp클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
copy cppTv t; // Tv 클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv 인스턴스의 주소를 t에 저장
예)
copy typescriptclass Tv {
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
public class TvTest {
public static void main(String[] args) {
Tv t;
t = new Tv();
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
new 연산자
copy java클래스 변수 = new 클래스();
인스턴스(객체)를 생성해주는 역할
메모리(Heap 영역)에 데이터를 저장할 공간을 할당받고
그 공간의 참조값을 객체에게 반환하여 주고 이어서 생성자를 호출한다.

메서드
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
메서드 정의하는 방법
copy scss반환타입 메서드 이름(타입 변수명, 타입 변수명, ...) // 선언부
{
// 메서드 호출 시 수행될 코드 // 구현부
}
copy cppint add(int a, int b) // 선언부
{
// 구현부
int result = a + b;
return result; // 호출한 메서드로 결과를 반환하다.
}
메서드 선언부
반환타입, 메서드 이름, 매개변수 선언으로 구성되어 있음.
copy scss반환타입 메서드 이름(매개 변수 선언) {};
copy cppint add(int x, inty) {};
💡 참고 - 인자(argument) 와 매개변수(parameter)
- 인자(argument)
- 메서드를 호출할 때 괄호 안에 지정해준 값
- 매개변수(parameter)
- 메서드를 선언할 때 정의한 것
메서드 구현부
메서드가 호출되었을 때 수행될 문장
메서드의 반환타입이 void가 아닌 경우, 구현부 안에 return 반환값이 반드시 포함되어 있어야한다.
생성자
인스턴트가 생성될 때 호출되는 인스턴스 초기화 메서드
여기서 인스턴스 초기화란, 인스턴스 변수들을 초기화하는 것을 뜻한다.
🚨 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
- 인스턴스 생성 과정
- 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
- 생성자 Card()가 호출되어 수행된다.
- 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
- Card c = new Card();
생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야한다.
- 생성자는 리턴 값이 없다.
생성자 정의하는 방법
기본 생성자
copy javascript클래스이름() {}
Card() {}
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야한다.
생성자가 정의되어 있지 않을 경우, 컴파일러가 기본생성자를 추가해서 컴파일 한다.
기본 생성자는 위와 같이 아무 매개변수도, 아무 내용도 없는 것을 말한다.
매개변수가 있는 생성자
말그대로 매개변수가 있는 생성자다.
생성자도 메소드 처럼 매개변수를 선언하여 호출 시 값을 넘겨 받아서 인스턴스 초기화 작업에 사용될 수 있다.
ex)
copy javascriptclass Car {
String color;
String gearType;
int door;
Car() {} // 기본 생성자
Car(String c, String g, int d) { // 생성자
color = c;
gearType = g;
door = d;
}
}
copy swift// 생성자를 사용하지 않았을 때
Car c = new Car();
c.color = "white";
c.grearType = "auto";
c.door = 4;
copy cpp// 생성자 사용 시
Car c = new Car("white", "auto", 4);
this
JAVA에서 this는 객체, 자기자신을 나타낸다.
this를 사용하는 상황은 크게 3가지가 있다.
1. 클래스의 속성과 생성자/ 메소드의 매개변수의 이름이 같은 경우
this를 사용하지 않은 예
copy csharppublic class Fruit {
public String name;
public String color;
public double weihgt;
public int count;
public Fruit(String name, String color, double weight, int count) {
name = name;
color = color;
weight = weight;
count = count;
}
public static void main(String[] args) {
Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
System.out.println("name: " + banana.name); // name: null
System.out.println("color: " + banana.color); // color: null
System.out.println("weight: " + banana.weihgt); // weight: 0.0
System.out.println("count: " + banana.count); // count: 0
}
}
일반적으로 생성자 또는 set/get 메소드의 매개변수 이름은 클래스의 속성 이름과 동일하게 적용된다.
위에서 보여지는 생성자의 매개변수 역시 클래스 속성과 동일한 이름으로 정의되어 있다.
그런데 main 메소드에서 Fruit 객체를 생성하고 속성 값들을 출력해보니 예상치 못한 결과가 나타난다.
초기화가 이루어 지지 않았다. ("banana", "yellow", 5.0, 10);라고 값을 입력했음에도 불구하고.
생성자의 구현 부분에서 name = name; 처럼 사용하게 되면
매개변수 name = 매개변수 name 형태가 되어 Fruit 객체의 name 속성에는 값이 입력되지 않는다.
즉, Java 는 좌측의 name이 속성을 가리키고 있다는 사실을 인지하지 못한다.
이럴 때 this 키워드가 사용된다.
copy csharppublic class Fruit {
public String name;
public String color;
public double weight;
public int count;
public Fruit(String name, String color, double weight, int count) {
this.name = name;
this.color = color;
this.weight = weight;
this.count = count;
}
public static void main(String[] args) {
Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
System.out.println("name: " + banana.name); // name: banana
System.out.println("color: " + banana.color); // color: yellow
System.out.println("weight: " + banana.weight); // weight: 5.0
System.out.println("count: " + banana.count); // count: 10
}
}
this.name = name; 은 Fruit 객체의 name 속성 = 매개변수 name 형태가 되어 Fruit 객체의 속성이 값을 입력하게 된다.
여기서 this 키워드는 객체 자신의 속성을 나타내게 되는 것이다.
2. 클래스에 오버로딩된 다른 생성자 호출
생성자의 최상단에 사용되어야 한다.
copy typescriptpublic class Fruit {
public String name;
public String color;
public double weight;
public int count;
public Fruit(String name, String color) {
// Fruit(String name, String color, double weight, int count)를 호출
this(name, color, 0.0, 0);
}
public Fruit(String name, String color, double weight, int count) {
this.name = name;
this.color = color;
this.weight = weight;
this.count = count;
}
public static void main(String[] args) {
Fruit banana = new Fruit("banana", "yellow", 5.0, 10);
System.out.println("name: " + banana.name); // name: banana
System.out.println("color: " + banana.color); // color: yellow
System.out.println("weight: " + banana.weight); // weight: 5.0
System.out.println("count: " + banana.count); // count: 10
}
}
하나의 클래스에 여러개의 생성자가 오버로딩되어 있을 때
일부분을 제외하고는 서로 중복된 코드를 가지고 있는 경우가 많이 있다.
오버로딩
- 너무 많이 적재했다(Overloading)는 뜻
- 같은 이름의 메서드에 매개변수의 타입, 개수를 다르게 한 것
이런 순간에 내부에 정의된 다른 생성자를 호출하여 코드의 중복을 피하고 깔끔하게 소스를 작성할 수 있다.
같은 클래스에 오버로딩 된 다른 생성차를 호출할 때 this 키워드가 사용된다.
생성자를 호출할 때에는 원하는 생성자의 매개변수를 확인한 후 메소드를 호출하는 것 처럼
this(매개변수...)의 형태로 이용하면 된다.
위에선 2개의 매개변수를 입력받은 생성자(name, color)의 구현부분에서
4개의 매개변수를 생성자(name, color, weight, count)를 호출하고 있다.
3. 객체 자신의 참조값을 전달하고 싶을 때
copy typescriptpublic class Fruit {
public String name;
public String color;
public double weight;
public int count;
public Fruit(String name, String color, double weight, int count) {
this.name = name;
this.color = color;
this.weight = weight;
this.count = count;
}
public Fruit getFruitInstance() {
return this;
}
}
어떤 메소드에서는 동작을 완료하고 리턴값으로
메소드의 매개변수로 객체, 자기 자신의 참조값을 전달하고 싶어하는 경우가 있다.
이럴 때 getFruitInstance() 처럼 this 키워드를 이용함으로써 구현이 가능하다.