신년이 며칠 남지 않았다. 벌써 2023년이라니 믿기지가 않는다. 😂
다들 바쁜 연말을 보내고 있는 와중에 오른쪽 목에 담이 걸렸다... 이 정도로 아픈건 정말 오랜만이라 근육 이완제, 파스, 온찜질 온갖 걸 시도 해보고있지만 차도가 없다.
바른 자세로 목을 꼿꼿이 펴고 공부를 시작해보자!
지난 글(객체지향 프로그래밍 기초1)에서 객체 생성까지 공부했었다. 오늘은 객체의 활용부터 공부해보도록 하자!
클래스명 참조_변수명 = new 생성자();
지난시간, 인스턴스는 위의 문법을 사용하여 생성하였다. 이제 생성된 인스턴스의 필드값 혹은 메서드를 사용하려면 .
을 사용하면된다.
참조_변수명.필드명 //필드값 불러오기
참조_변수명.메서드명 // 메서드 호출
직접 한번 작성하며 알아보도록 하자!
자 Car
클래스를 먼저 살펴보자. Car
는 2개의 속성model, color
를 가지고 있으며, public Car
라는 생성자와, 세 개의 메서드 power, accelerate, stop
을 가지고 있다.
그렇다면 main
을 살펴보자. bmw
를 참조변수로 Car클래스의 생성자를 사용하여 인스턴스를 만듦과 동시에 초기화 해주었다. 이로서 참조변수 bmw
가 참조한 Car의 인스턴스는 "테슬라 x ", "쥐색" 이라는 속성을 가지게 되었다.
출력해보자 println
가로 안의 bmw **.** model
로 인스턴스의 모델을 확인 할 수 있다. 기능 또한 똑같다 .
을 사용하여 메서드를 호출할 수 있다.
필드는 클래스에 포함된 변수 를 의미하는 것으로, 객체의 속성을 정의 할 때 사용한다.
크게 클래스 변수(cv), 인스턴스 변수(iv), 지역 변수(lv)로 구분할 수 있다. 이 중 클래스 변수와 인스턴스 변수를 필드라 부를 수 있으며 이 둘은 static
키워드 유무로 구분 할 수 있다.
클래스 변수(cv) : 클래스 변수는 저장된 값을 해당 클래스 생성자를 통해 만들어진 모든 인스턴스들과 공유하는 값을 저장하는 변수로 인스턴스가 만들어 지기전에 사용 할 수 있습니다. 클래스 영역에 저장됩니다.
인스턴스 변수(iv) : 인스턴스 변수는 인스턴스의 고유 속성을 저장하는 변수로 new
키워드를 통해 인스턴스가 생성 될 때 힙 메모리에 저장됩니다.
지역 변수(lv) : 지역 변수는 메서드 내에서 사용되는 변수로 {블록}
안에서만 사용가능 한 변수입니다. 메서드가 종료되는 것과 동시에 함께 소멸되어 사용할 수 없습니다. 스택 메모리에 저장됩니다.
메서드는 특정 기능을 수행하는 명령문들의 집합을 의미한다. 앞서 본 코드에서 자동차의 시동걸기, 가속, 정지 등이 메서드로 정의되었고 사용되었다.
메서드는 메서드 시그니쳐와 메서드 바디로 구분된다
접근제어자 반환타입 메서드명(매개 변수){ // 메서드 시그니쳐
메서드 기능 정의 //메서드 바디
}
메서드 반환타입이 void
가 아닌 경우에는 메서드 바디{}
안에 반드시 return
문이 존재해야한다.
메서드 오버로딩은 하나의 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것 입니다.
class Area{
public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
System.out.println("넓이");
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r);
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w * l);
}
public void area(double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h);
}
}
이처럼 area라는 동일한 메서드명에 다른 매개변수들을 할당함으로서 다른 결과값을 도출할 수 있습니다. 하지만 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되진 않습니다. 메서드 오버로딩이 성립되기 위해선 크게 두 가지 조건이 성립되어야합니다.
참고로 반환타입은 오버로딩이 성립하는데에 영향을 주지 않습니다.
오버로딩의 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것입니다.
우리가 이미 사용하고 있는 Arrays클래스의 copyOf 메서드 입니다. 동일한 이름의 메서드명으로 오버라이딩되어 사용됩니다.
생성자는 말 그대로 객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드 입니다. 우리가 다른 메서드를 사용할 때완 달리 new
키워드를 사용할 때 호출됩니다.
생성자는 인서턴스 변수들을 초기화 할 때 사용되는 특수한 메서드입니다. 생성자는 일반적인 메서드와 크게 두 가지 부분에서 차이가 있습니다
void
반환타입을 사용하지 않는다. 클래스명(매개변수){ // 생성자 기본구조
인스턴스 초기화 || 공백
}
클래스 명과 같은 메서드명을 작성해주고 리턴타입은 작성하지 않습니다. 한 가지 중요한 사실은 생성자도 오버로딩이 가능하므로 한 클래스 내에 여러 개의 생성자가 존재 할 수 있습니다.
우리는 이제 생성자를 사용할 때 this.라는 키워드를 굉장히 많이 사용하게 될겁니다. 생성자에서 this.은 밑의 형태로 사용되게 됩니다.
class Car{
Private String modelName;
private String color;
private int speed;
public Example(String modelName, String color, int speed){
this.modelName = modelName;
this.
}
}
사용 예제를 들어보겠습니다
public class ConstructorExample {
public static void main(String[] args) {
Car car = new Car("Model X", "빨간색", 250);
System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " + car.getColor() + "입니다.");
}
}
class Car {
private String modelName;
private String color;
private int maxSpeed;
public Car(String modelName, String color, int maxSpeed) {
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
}
public String getModelName() {
return modelName;
}
public String getColor() {
return color;
}
}
//Output
제 차는 Model X이고, 컬러는 빨간색입니다.
인스턴스의 변수로 modelName, color, maxSpeed
가 정의되어 있습니다. 동시에 생성자의 매개변수로 modelName, color, maxSpeed
가 정의되어있죠.
이런 경우 인스턴스 변수와 매개변수 이름만으로 구분하기 어려워지는 문제가 발생합니다.
이를 구분해주는 용도로 사용되는 것이 this
키워드 입니다.
즉, this
는 이 객체 자신의 인스턴스 변수를 가르켜주는 구분자라고 생각하시면 됩니다.
this()
는 키워드가 아닌 메서드입니다. this()
메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우 사용됩니다. 또한 사용할때에 두가지 문법요소를 충족시켜야합니다.
this()
메서드는 반드시 생성자의 내부에서만 사용된다.this()
메서드는 반드시 생성자의 바디 첫줄에 위치해야한다.예를 들어보겠습니다
public class Test {
public static void main(String[] args) {
Example example = new Example();
Example example2 = new Example(5);
}
}
class Example {
public Example() {
System.out.println("Example의 기본 생성자 호출!");
};
public Example(int x) {
this();
System.out.println("Example의 두 번째 생성자 호출!");
}
}
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!
처음 참조변수 example
에 생성자를 할당 할때 new
키워드를 통해 Example()
이 호출되어 인스턴스가 생성됩니다.
example
도 동일한 기전으로 작동합니다. 그러나 Exaple
에 int
매개변수가 존재하기 때문에 오버로딩된 생성자를 호출하게됩니다.
Example(int x)
생성자에서 this()
를 호출하게되고 이것은 같은 클래스 내에 존재하는 다른 생성자를 호출하여서 System.out.println("Example의 기본 생성자 호출!");
이 실행된 후에 System.out.println("Example의 두 번째 생성자 호출!");
를 실행하게 됩니다.
오늘은 클래스 내의 구성 기초에 대하여 공부해 보았다.
점점 갈수록 메모리 영역, static, 접근제어자 라는 용어가 나오는거 보니 슬슬 마음의 준비를 해둬야 할 것 같다....
파이팅!!