본문 바로가기
Programming/Java

[F-Lab 모각코 챌린지 8일차] TIL : 자바의신 8장

by 구튼탁 2023. 6. 10.
728x90

학습 목표


  • 참조 자료형의 생성자와 메서드
  • call by value & call by Reference

학습 결과 요약


  • 참조 자료형의 생성자는 만들어 주지 않으면 컴파일 시 자동 생성된다. 단 매개변수가 있는 생성자가 하나도 없을 경우에.
  • 메서드 오버로딩은 같은 역할을 하는 메서드는 같은 이름을 가져야한다는 모토에서 시작되었으며 매개 변수의 타입과 순서만 다르면 같은 이름의 메서드를 여러개 만들 수 있다.
  • pass by value 는 복제된 값이 넘겨져서 넘겨받은 메서드에서 무슨짓을 해도 원래 값은 변하지 않는다.
  • pass by reference 는 객체의 주소값이 넘겨져서 넘겨 받은 메서드에서 변경을 하면 그대로 데이터가 바뀐다.
  • static 메서드는 클래스에 고정된 멤버로서 객체를 초기화하지 않아도 사용 가능하다. 클래스가 로딩될 때 로딩된다. 초기화 작업은 static block 통해 가능하다. 최초 한 번만 실행된다.

 

 

학습 내용


참조 자료형

  • 자바에서 기본 자료형을 제외한 모든 자료형은 참조 자료형이다
  • 참조 자료형이 사용할 수 있는 자료형은 오직 = 연산 하나다.

기본 생성자

class Apple {
	String name;
}

public static void main(String[] args){
	Apple apple = new Apple();
}
  • 객체 생성할 때 new 뒤에 클래스 이름과 동일하고() 소괄호로 끝나는 것이 기본 생성자다.
  • 생성자 : 자바 클래스의 객체를 생성하기 위해 존재한다. 생성자의 리턴 타입은 클래스의 객체기 때문이며, 클래스와 이름이 동일해야 컴파일러가 알아 차릴 수 있다.
  • 클래스에 생성자를 만들어 주지 않아도 컴파일 시 자동으로 만들어 준다. 단, 다른 생성자가 없을 경우에만.
  • 하나의 클래스에 생성자를 여러개 만들 수 있는데, 그 목적은 상황에 맞는 생성자를 사용하도록 함이다. → 꼭 필요한 생성자만 만드는 습관을 갖자.
class Member {
	String name;
	String phone;
	String address;
	int age;

	Member(String name){
		this.name = name;
	}

	Member(String name, String phone){
		this.name = name;
		this.phone = phone;
	}

	Member(String name, String phone, String address){
		this.name = name;
		this.phone = phone;
		this.address = address;
	}
}

this

  • 객체의 변수와 매개 변수의 이름이 동일할 때, 인스턴스 변수를 구분하기 위해 사용
  • 생성자와 메서드 안에서 사용할 수 있다.

메서드 오버로딩

  • 메서드 이름은 같고 매개 변수들을 다르게 해 여러개 만들 수 있다.
  • 조건은 매개 변수의 순서와 타입이 달라야 한다.

  • 메서드 오버로딩은 같은 역할을 하는 메서드는 같은 이름을 가져야 한다는 모토로 사용한다. 위 예시 코드에서 매개 변수를 무엇을 받던 두 메서드의 역할은 출력이다.

 

메서드에서 값 넘겨주기

  • 자바에서는 모든 타입을 한 개만 리턴 타입으로 넘겨줄 수 있다.
  • 메서드가 종료되는 조건
    • 메서드의 모든 문장이 실행되었을 때
    • return 문장에 도달했을 때
    • 예외가 발생했을 때

static 메서드 일반 메서드 차이

  • static method는 클래스에 고정된 멤버로서 객체를 생성하지 않아도 사용할 수 있다.
  • Static method는 클래스 변수만 사용 가능하다. → 객체가 없어도 실행되기 때문에 인스턴스 변수나 메서드에는 접근이 애초에 불가능함
  • 로딩 시점
    • 클래스 로더가 클래스를 로딩해서 method area 영역에 적재할 때 → 클래스의 로딩이 끝나면 바로 사용 가능
  • 초기화 작업
    • non-static method : 생성자에서 한다.
    • static method : 객체를 생성하지 않고 사용하는 메서드이므로 static block 을 제공한다. 클래스가 메모리로 로딩될 때 자동적으로 실행된다.
  • 인스턴스 변수 & 클래스 변수 선택공용적인 데이터라면 정적 필드로 선언하는 것이 좋음
  • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언.
  • 인스턴스 메서드 & 정적 메서드 선택인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언
  • 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언

 

 

pass by value, pass by reference

  • 메서드의 매개 변수가 전달될 때 변수가 기본 자료형이냐 참조 자료형이냐에 따라 차이가 있다.
    • 기본 자료형 : 기본 자료형은 원래의 값은 놔두고 복제된 값이 전달된다.
      public static void main(String[] args) {
          ReferencePass ref = new ReferencePass();
          ref.callPassByValue();
      }
      
      private void callPassByValue() {
          int a = 10;
          String b = "b";
      
          System.out.println("a= " + a);
          System.out.println("b= " + b);
      
          passByValue(a, b);
      
          System.out.println("a= " + a);
          System.out.println("b= " + b);
      
      }
      
      private void passByValue(int a, String b) {
          a = 20;
          b = "z";
      }
      
      before passByValue
      a= 10
      b= b
      in passByValue
      a= 20
      b= z
      after passByValue
      a= 10
      b= b
      
    • 그래서 passByValue() 안에서 무슨 일이 벌어져도 callPassByValue에서 선언된 int a 의 값은 변하지 않는다.
    • 참조 자료형 : 참조 자료형은 객체의 주소값이 전달되는 점에 유의해야 한다.
    • 두 메서드의 변수 dto 는 메모리의 같은 객체를 참조하고 있다. 그래서 호출된 메서드에서 변경한 대로 데이터가 바뀐다.
public static void main(String[] args) {
	ReferencePass ref = new ReferencePass();
	ref.callPassByReference();
}

private void passByRef(MemberDto dto) {
    dto.name = "Ronaldo";
    System.out.println("in PassByRef");
    System.out.println("dto.name = " + dto.name);
}

private void passByValue(int a, String b) {
  a = 20;
  b = "z";

  System.out.println("in passByValue");
  System.out.println("a= " + a);
  System.out.println("b= " + b);
}
before passByRef
dto.name = Messi

in PassByRef
dto.name = Ronaldo

before passByRef
dto.name = Ronaldo

 

 

728x90

댓글