인스턴스를 생성한 후, '참조변수.메서드이름()' 으로 호출
인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련된 작업을 하는 메서드
class InstMethod7_1 {
int num1, num2; // 인스턴스 변수 선언
static int num3 = 100;
int add(int num1, int num2) { // 메서드 반환타입 앞에 static 이 없기 때문에 인스턴스 메서드 입니다.
System.out.println();
System.out.println("매개변수로 입력 받은 num1, num2 확인");
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
// 계속된 실습으로 우리는 위에 매개변수 num1, num2 와 InstMethod7_1 의 인스턴스 변수는 다르다는 것을 알았습니다.
// 그럼 이런 의문이 듭니다. InstMethod7_1 클래스로 methodTest 객체를 생성했고
// 참조변수를 통해 methodTest.num1 = 10; 와 같이 인스턴스 변수에 값도 넣었는데
// 저 값을 매개변수로 받는 의미가 있는 건가? 확인해 보겠습니다.
// 인스턴스 변수 값 확인 : this 는 뒤에서 배우기 때문에 간단히 설명드리자면 인스턴스 변수와 매개변수를 구분하기 위한 것입니다.
System.out.println("this.num1 = " + this.num1);
// 10 이렇게 10이 출력될겁니다. 그럼 비교를 위해 아래 methodTest.add(methodTest.num, methodTest.num2);
// 주석 하고 methodTest.add(80, 90); 주석을 푸세요1
System.out.println("매개변수 이자 지역변수 num1 = " + num1);
// 값이 달라졌을 겁니다. 이제 인스턴스 num1 과 매개변수 num1 은 이름만 같을 뿐이라는 것을 아셨을 겁니다.
// 그래서 구분을 위해 변수의 이름을 다르게 하거나 this 를 사용해서 구분해야 합니다.
// 그럼 지금 상황에서는 매개 변수를 받지 않고
// return.this.num1 + this.num2; // 이렇게 해도 됩니다.
// 이번에는 그럼 일반 메서드니까 클래스 변수는 사용하지 못 할까? 아래 주석 제거하세요!
// System.out.println("InstMethod7_1.num3 = " + InstMethod7_1.num3); // 당연하게도 사용 가능합니다!
return num1 + num2;
}
}
class InstMethod7_1Main {
public static void main(String[] args) {
InstMethod7_1 methodTest = new InstMethod7_1(); // 객체 생성
methodTest.num1 = 10;
methodTest.num2 = 20;
// 참조변수를 사용하여 인스턴스 메서드 호출
System.out.println("result : " + methodTest.add(methodTest.num1, methodTest.num2));
// System.out.println("result : " + methodTest.add(80, 90));
}
}
한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것입니다.
오버로딩의 성립 조건
- 메서드 이름이 같아야함.
- 매개변수으이 개수 또는 타입, 위치가 달라야함.
- 변환타입에는 영향을 받지 않음.
사용하는 목적
매개변수 즉, 입력하는 값이 다르지만 같은 기능을 수행하는 경우가 많을 때 사용성 및 효율을 높이기 위해 어버로딩을 사용함.
e.g.
void println()
void println(boolean x)
void println(char x)
void println(char{} x)
void println(double x)
...
// 이와같이 같은 메서드를 다른목적으로 여러번 사용가능.
class Overloading8_1 {
int add(int a, int b) {
System.out.println("int add(int a, int b)");
return a + b;
}
// void add(int a, int b) { // 반환 타입이 다르다고 오버로딩이 성립되지는 않음
// System.out.println("void add(int a, int b)");
// System.out.println("a + b = " + a + b);
// }
long add(long a, long b) {
System.out.println("long add(long a, long b)");
return a + b;
}
long add(long a, int b) {
System.out.println("long add(long a, int b)");
return a + b;
}
long add(int a, long b) {
System.out.println("long add(int a, long b)");
return a + b;
}
}
class Overloading8_1Main {
public static void main(String[] args) {
Overloading8_1 test = new Overloading8_1();
System.out.println(test.add(10, 20));
System.out.println(test.add(13L, 17L));
System.out.println(test.add(5L, 10));
System.out.println(test.add(12, 23L));
System.out.println();
// 그런데 이때 위에 int add(int a, int b) 를 주석한다면
test.add(10, 20); // 여기에 Ambiguous method call Error 가 발생합니다.
// int, int 는 (long, int) , (int, long) 2개의 메서드 모두 가능하기 때문에 컴퓨터가 하나를
// 마음대로 선택할 수가 없어서 발생하는 오류입니다.
}
}
인스턴스가 생성도리 때마다 호출되는 '인스턴스 초기화 메서드' 입니다.
- 인스턴스 새서시 수행할 작업에 사용됨.
초기값이 필요한 인스턴스 변수의 값을 초기화 해줌.생성조건
- 이름이 클래스 이름과 같아야 함.
- return 값이 없음.
- void는 붙이지 않음.
- 오버로딩 가능.
- 매개변수가 없는 생성자를 의미.
- 생성자를 하나도 선언되어 있지 않았을 때는 컴파일러가 자동으로 추가.
class Tv9_1 {
// 속성 : 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 위 속성에서 필수로 초기값이 필요한 값들을 초기화 해주는 기본 생성자
public Tv9_1() {
power = false;
channel = 1;
}
// 오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화가 필요합니다. this 는 이전 챕터에서 잠깐 봤었죠! 매개변수와 인스턴스변수를 구분하기 위해 사용하겠습니다.
public Tv9_1(String color, long price) {
power = false; // this.power, power 둘다 지금 상황에서는 인스턴스 변수를 명확하게 판단 할 수 있기 때문에 어떤걸 사용해도 상관 없습니다.
channel = 1;
this.color = color;
this.price = price;
}
// 기능 : 메서드 선언
void power() { // 전원 기능
power = !power;
if (power) {
System.out.println("전원 ON");
} else {
System.out.println("전원 OFF");
}
}
void channelUp() { // 채널 증가
channel++;
System.out.println("채널 증가");
}
void channelDown() { // 채널 감소
channel--;
System.out.println("채널 감소");
}
}
class Tv9_1Main {
public static void main(String[] args) {
// 기본 초기화된 Tv9_1 생성
Tv9_1 tv = new Tv9_1();
System.out.print("기본 생성자 TV: ");
tv.power();
// 진열 용 Tv9_1 생성
Tv9_1 exTv = new Tv9_1("보라색", 3456789);
System.out.print("오버로딩 생성자 TV: ");
exTv.power();
System.out.println("exTv.color = " + exTv.color);
System.out.println("exTv.price = " + exTv.price);
// 근데 이때 주의할 점!
// 기본 생성자는 없고 오버로딩한 생성자만 있을 경우!
// 컴파일러는 기본 생성자를 만들어주지 않기 때문에 기본 생성자를 사용하려고 하면 Error 발생!
// 위 기본 생성자를 주석 하세요!!!!
Tv9_1 tv2 = new Tv9_1(); // Error 발생, 기본 생성자가 없기 때문에 매개 변수를 넣으라고 intellij 가 요구합니다.
}
}
오늘도 어제에 이어서 객체지향에 대해 공부하였다. 이번주는 사전캠프 커리큘럼상 팀원간 알고리즘 문제 풀이가 있어 Java언어 학습에 시간투자를 많이 하지는 못하였다.(알고리즘 문제풀이에는 Python이 조금더 유리하다고 하여서 Python 언어도 같이 학습을 하고 있다.) 그래도 1주일이 지나니 조금은 컴퓨터언어와 친해진 것 같기도 하다.