2023-12-13 (5일차) - field, method, this, static, 매개변수

민짱·2024년 1월 7일
post-thumbnail

📅2023. 12. 13 5일차


🎨 Java

this란?

  • this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수.

  • 이러한 this 참조 변수는 해당 인스턴스의 주소를 가리키고 있다.

  • this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에는 사용할 수 없다.

  • this. 생략 가능.

  • this()메소드

    • this()메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
    • this()메소드에 인수를 전달하면, 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출해 준다.

메소드(method)?

  • 자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다.
    그중에서 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있다.

매개변수, parameter

  • 매개변수란 함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미한다.

인자, 인수, args

  • 인수란 함수가 호출될 때, 함수로 값을 전달해주는 값을 말한다.

arguments 객체

  • 만약 함수의 정의보다 더 많은 수의 인수가 전달되면, 매개변수에 대입되지 못한 인수들은 참조할 방법이 없게 된다. 하지만 arguments 객체를 이용하면, 함수로 전달된 인수의 총 개수를 확인하거나, 각각의 인수에도 바로 접근할 수 있다.

디폴트 매개변수(default parameter)

  • 디폴트 매개변수란 함수를 호출할 때 명시된 인수를 전달하지 않았을 경우에 사용하게 될 기본값을 의미한다.

나머지 매개변수(rest parameter)

  • 나머지 매개변수는 생략 접두사(...)를 사용하여 특정 위치의 인수부터 마지막 인수까지를 한 번에 지정할 수 있다.

변수의 스코프

  • 변수을 사용할 수 있는 사용범위를 '스코프'라고 부른다.

class 안에 var1이란 변수가 선언 됬으면 var1의 스코프는 클래스 전체에서 놀 수 있다. 즉 foo() 메소드 안에서도 들어 갈 수 있다. 하지만 var2 변수는 foo() 안에서의 초록색 칸에서만 사용할 수 있다. 즉, 반대로, var2의 집은 foo()로 한정되어 있으므로, 집밖으로 나갈 수 없다.


변수의 생명주기

  • 모든 변수는 생명주기라는 걸 가지게 된다. 생명주기란, 변수가 생성되고 죽는걸 말한다. 이런 간단하게 클래스 내에서 선언하는 변수를 인스턴스 변수라고 하고, 메소드 내에서 선언하는 변수를 지역변수라고 한다.

지역변수(local variable)

  • 중괄호{} 내에 선언된 변수
  • 생명시작 [중괄호 시작( { ) ]
  • 소멸 [중괄호 끝 ( } )]

매개변수(parameter)

  • 메소드에 넘겨주는 변수
  • 생명시작 메소드가 호출될 때
  • 소멸 메소드가 끝날 때

인스턴스변수(instance variable)

  • 메소드 밖, 클래스 안에 선언된 변수
  • 생명시작 객체가 생성될 때
  • 소멸 그 객체를 참조하고있는 다른 객체가 없을 때

클래스변수(class variable)

  • 인스턴스 변수 중 타입 선언 앞에 static이라는 예약어가 있는 변수
  • 생명시작 클래스가 처음 호출될 때
  • 소멸 자바 프로그램이 끝날 때

오버로딩 (Overloading)

  • 오버로딩이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. 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();
    }
}

오버로딩을 사용하는 이유

  • 1.같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
  • 2.메소드의 이름을 절약할 수 있다.

오버라이딩(Overriding)

  • 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩을 할 필요가 생가ㅣㄴ다.

오버라이딩의 조건

  • 오버라이딩은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값을 모두 갈아야 한다.
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("훌쩍훌쩍");
	}
}
  • 오버로딩 = 기존에 없는 새로운 메소드를 추가하는 것
  • 오버라이딩 = 상속받은 메소드를 재정의 하는 것
구분OverridingOverloading
접근 제어자부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다.모든 접근 제어자를 사용할 수 있다.
리턴형동일해야 한다.달라도 된다.
메소드명동일해야 한다.동일해야 한다.
매개변수동일해야 한다.달라야만 한다.
적용 범위상속관계에서 적용된다.같은 클래스 내에서 적용된다.

📋 문제 풀이

  • 문제 : 자동차 설계도를 만들어주세요.
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
>- 변수의 생명주기
>- 변수의 라이프사이클
>- 변수의 스코프
>- 지역변수 : 지역공간, 메서드 내부
>- 전역변수 : 전역공간, 메서드 외부
>- 매개변수 : 매개체

## 💡느낀점 
> 항상 왜라는 의문점을 가지고 코드를 보자 각 각의 코드의 의미를 잘 생각하자!

0개의 댓글