
📅2023. 12. 13 5일차
this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수.
이러한 this 참조 변수는 해당 인스턴스의 주소를 가리키고 있다.
this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에는 사용할 수 없다.
this. 생략 가능.
this()메소드
- 매개변수란 함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미한다.
- 인수란 함수가 호출될 때, 함수로 값을 전달해주는 값을 말한다.
- 만약 함수의 정의보다 더 많은 수의 인수가 전달되면, 매개변수에 대입되지 못한 인수들은 참조할 방법이 없게 된다. 하지만 arguments 객체를 이용하면, 함수로 전달된 인수의 총 개수를 확인하거나, 각각의 인수에도 바로 접근할 수 있다.
- 디폴트 매개변수란 함수를 호출할 때 명시된 인수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미한다.
- 나머지 매개변수는 생략 접두사(...)를 사용하여 특정 위치의 인수부터 마지막 인수까지를 한 번에 지정할 수 있다.
class 안에 var1이란 변수가 선언 됬으면 var1의 스코프는 클래스 전체에서 놀 수 있다. 즉 foo() 메소드 안에서도 들어 갈 수 있다. 하지만 var2 변수는 foo() 안에서의 초록색 칸에서만 사용할 수 있다. 즉, 반대로, var2의 집은 foo()로 한정되어 있으므로, 집밖으로 나갈 수 없다.
- 오버로딩이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것이다. 하지만 자바에서는 메소드 이름으로 여러 기능을 구현하기 때문에 '과적하다.'라는 뜻의 이름을 붙여준 것 이다.
- 오버로딩의 정의는 자바의 한 클래스 내에 이미 사용하려는 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같는 이름을 사용해서 메소드를 정의할 수 있다.
메소드의 이름이 같고, 매개변수의 개수나 티입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
class OverlodingTest {
pubilc static void main(String[] args) {
om.print();
System.out.println(om.print(3));
om.print("Hello!");
System.out.println(om.print(4,5));
}
}
class OverlodingMethods {
pubilc static void print() {
System.out.println("오버로딩1");
}
String print(Integer a) {
System.out.println("오버로딩2");
return a.toString();
}
void print(String a) {
System.out.println("오버로딩3");
System.out.println(a);
}
String print(Integer a, Integer b) {
System.out.println("오버로딩4");
return a.toString() + b.toString();
}
}
- 오버라이딩은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값을 모두 갈아야 한다.
public class OverridingTest {
public static void main(String[] args) {
Person person = new Person();
Child child = new Child();
Senior senior = new Senior();
person.cry();
child.cry();
senior.cry();
}
}
class Person {
void cry() {
System.out.println("흑흑");
}
}
class Child extends Person {
@Override
protected void cry() {
System.out.println("잉잉");
}
}
class Senior extends Person {
@Override
public void cry() {
System.out.println("훌쩍훌쩍");
}
}
- 오버로딩 = 기존에 없는 새로운 메소드를 추가하는 것
- 오버라이딩 = 상속받은 메소드를 재정의 하는 것
| 구분 | Overriding | Overloading |
|---|---|---|
| 접근 제어자 | 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다. | 모든 접근 제어자를 사용할 수 있다. |
| 리턴형 | 동일해야 한다. | 달라도 된다. |
| 메소드명 | 동일해야 한다. | 동일해야 한다. |
| 매개변수 | 동일해야 한다. | 달라야만 한다. |
| 적용 범위 | 상속관계에서 적용된다. | 같은 클래스 내에서 적용된다. |
- 문제 : 자동차 설계도를 만들어주세요.
class Main {
public static void main(String[] args) {
}
}
class Car {
int speed;
String color;
String name;
- 문제 : 자동차 객체를 만들고 변수에 담아주세요.
class Main {
public static void main(String[] args) {
Car a = new Car();
Car b = new Car();
}
}
class Car {
int speed;
String color;
String name;
}
- 문제 : 자동차 객체마다 서로 다른 최고속력를 가지도록 해주세요
class Main {
public static void main(String[] args) {
Car a = new Car();
a.name = "람보르기니";
a.color = "검정색";
a.speed = 320;
Car b = new Car();
b.name = "아반떼";
b.color = "흰색";
b.speed = 200;
}
}
class Car {
int speed;
String color;
String name;
}
- 문제 : 자동차가 3번 달리게 해주세요
class Main {
public static void main(String[] args) {
Car a = new Car();
a.name = "람보르기니";
a.color = "검정색";
a.speed = 320;
a.run();
Car b = new Car();
b.name = "아반떼";
b.color = "흰색";
b.speed = 200;
b.run();
}
}
class Car {
int speed;
String color;
String name;
void run() {
System.out.println("자동차가 3번 달립니다.");
}
}
- 문제 : 3개의 자동차가 각각 1번씩 달리게 해주세요.
class Main {
public static void main(String[] args) {
Car a = new Car();
a.name = "람보르기니";
a.color = "검정색";
a.speed = 320;
a.run();
Car b = new Car();
b.name = "벤츠";
b.color = "흰색";
b.speed = 250;
b.run();
Car c = new Car();
c.name = "아반떼";
c.color = "회색";
c.speed = 200;
c.run();
}
}
class Car {
int speed;
String color;
String name;
void run() {
System.out.println("자동차가 달립니다.");
}
}
- 문제 : 번호가 다른 각각의 자동차가 서로 다른 최고속력으로 달리게 해주세요.
class Main {
public static void main(String[] args) {
Car a = new Car();
a.name = "람보르기니";
a.number = 1;
a.color = "검정색";
a.speed = 320;
a.run();
Car b = new Car();
b.name = "벤츠";
b.number = 2;
b.color = "흰색";
b.speed = 250;
b.run();
Car c = new Car();
c.name = "아반떼";
c.number = 3;
c.color = "회색";
c.speed = 200;
c.run();
}
}
class Car {
int speed;
int number;
String color;
String name;
void run() {
System.out.printf("%d번 자동차가 최고속력 %s 달립니다.\n", this.number, this.speed);
}
}
## 🔔 TODO
>- 변수의 생명주기
>- 변수의 라이프사이클
>- 변수의 스코프
>- 지역변수 : 지역공간, 메서드 내부
>- 전역변수 : 전역공간, 메서드 외부
>- 매개변수 : 매개체
## 💡느낀점
> 항상 왜라는 의문점을 가지고 코드를 보자 각 각의 코드의 의미를 잘 생각하자!