minghxx.blog
  • 자바의 정석 65~69강 static&인스턴스 메서드, 오버로딩, 생성자, this(), 변수 초기화
    2023년 08월 04일 04시 31분 22초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    ch 6-26~29 static 메서드와 인스턴스 메서드

    https://youtu.be/Fl4TzjPKAMU

    인스턴스 변수 사용여부가 인스턴스/static 메서드 차이

     

    1. 인스턴스 메서드

    • 인스턴스 생성 후 참조변수.메서드이름() 으로 호출
    • 인스턴스 멤버와 관련된 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수 사용가능

     

    2. static 메서드(클래스 메서드)

    • 객체 생성 없이 클래스이름.메서드이름() 으로 호출
      • Math.random(), Math.round()
    • 인스턴스 멤버와 관련 없는 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수 사용 불가
    class MyMath {
    	// 인스턴스 변수 iv
    	long a, b; 
    	
    	// 인스턴스 메서드
    	// iv 사용 매개변수가 없음
    	long add() { 
    		return a + b; // 인스턴스 변수 iv
        }
    	
    	// 클래스 메서드(static 메서드)
    	// iv를 사용하지 않을 때 만듦
    	// iv 사용안함 매개변수를 사용
    	static long add(long a, long b) { 
    		return a + b; // 지역 변수 lv
    	}
    }
    
    class MyMathTest2 {
    	public static void main(String args[]) {
        
    		// 클래스 메서드 호출
    		// 객체 생성없이 사용가능
    		System.out.println(MyMath2.add(200L, 100L); 
            
    		// 인스턴스 생성
    		MyMath2 mm = new MyMath2(); 
    		mm.a = 200L;
    		mm.b = 100L;
            
    		// 인스턴스 매서드 호출
    		// 객체 생성 후 사용가능
    		System.out.println(mm.add()); 
    	}
    }

     

    3. static

    속성 중 공통 속성에 static

    인스턴스 멤버를 사용하지 않는 메서드에 static

     

    4. 메서드 간의 호출과 참조

    • static메서드는 인스턴스 변수를 사용할 수 없음
      • 객체 생성 후 사용가능

    • static메서드는 인스턴스 메서드를 호출할 수 없다
      • 인스턴스 메서드는 인스턴스 변수를 사용하는 메서드로 객체를 생성 후 사용 가능

    https://shorturl.at/efmCU

     

    자바의 정석 56~60강 클래스의 정의, 변수 종류, 클래스/인스턴스 변수, 메서드

    ch 6-9~10 클래스 정의 1. 클래스 설계도 데이터+함수 사용자 정의타입 변수 : 하나의 데이터를 저장할 수 있는 공간 배열 : 같은 종류의 데이터를 묶어서 저장할 수 있는 공간 구조체 : 서로 연관된

    minghxx.tistory.com

     


    ch 6-30~31 오버로딩

    1. 오버로딩

    한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것

    예시로 println(), println(boolean x), println(char x) 등

     

    2. 오버로딩이 성립하기 위한 조건

    • 메서드 이름이 같아야 함
    • 매개변수 개수 또는 타입이 달라야 함
    • 반환타입은 영향 없음
    // 오버로딩
    long add(int a, long b) { return a + b; }
    long add(long a, int b) { return a + b; }
    
    add(3, 3); // ambiguous 에러발생. 어떤 메서드를 호출하는지 모호함

     

    +) 메서드 이름은 동사로


    ch 6-32~35 생성자, 기본 생성자

    1. 생성자 constructor

    인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

    • 클래스 이름과 같아야 함
    • 리턴값이 없음(void 안 붙임) → 반환값이 없기 때문
    • 모든 클래스는 반드시 생성자 있어야 함

     

    2. 기본 생성자

    매개변수가 없는 생성자

    생성자가 하나도 없을 때만 컴파일러가 자동 추가

    // 생성자가 하나도 없으면 컴파일러가 자동으로 추가 Data_2(){}
    class Data_1 {
    	int value;
    }
    
    // 생성자가 하나라도 있으면 직접 추가 Data_2(){}
    class Data_2 {
    	int value;
        
    	// Data_2(){} 기본 생성자 추가해야함
    	Data_2(int x) {
    		value = x;
    	}
    }
    
    class Ex6_11 {
    	pubic static void main(String[] args) {
    		Data_1 d1 = new Data_1();
            
    		// 에러 발생, 기본 생성자가 없어서 Data_2 찾지못함(cannot resolve symbol)
    		Data_2 d2 = new Data_2();
    	}
    }

     

    3. 매개변수가 있는 생성자

    // 기본생성자
    Car(){}
    
    // 매개변수가 있는 생성자
    Car(String c, String g) {
    	color = c;
    	type = g;
    }
    
    // 객체 생성
    Car c = new Car();
    c.color = "white";
    c.type = "auto";
    
    // 객체생성시 코드 간결
    Car c = new Car("white", "auto")
    
    /*
    
    1) 참조변수 c 생성
    2) new -> 객체 생성
    3) 생성자 -> 객체 초기화
    4) 참조변수 c에 객체 주소값 대입
    
    */

     


    ch 6-36~37 생성자 this(), 참조변수 this

    1. 생성자 this()

    같은 클래스 내 생성자에서 다른 생성자 호출할 때 사용

    다른 생성자 호출 시 첫 줄에서만 가능

    코드 중복을 제거하기 위해 서로 호출하는 경우 많음 this로 간결하게 사용할 수 있음

    2. 참조변수 this

    인스턴스 자신을 가리키는 참조변수

    인스턴스 메서드에서 사용가능(생성자 포함)

    지역변수 lv와 인스턴스 변수 iv를 구별할 때 사용

    Car(String color, String type) {
    	this.color = color;
    	this.type = type;
    	// this.-는 iv 인스턴스 변수
    	// color, type은 lv 지역변수
    	// color = color 이름이 같으면 서로 구별이 불가 this사용하여 구분
    }

     

    3. 참조변수 this와 생성자 this()

    this this()
    인스턴스 자신을 가리키는 참조변수
    인스턴스 주소 저장
    선언 없이도 사용 가능(인스턴스 메서드에 지역변수로 숨겨진채 존재)
    인스턴스 메서드에서 사용가능
    (클래스 메서드 static은 인스턴스 변수 iv 사용불가!! this도 불가)
    생성자
    같은 클래스의 다른 생성자 호출 시 클래스 이름 대신 사용


    ch 6-38~41 변수의 초기화, 멤버변수의 초기화

    1. 변수 초기화

    지역변수 lv는 수동 초기화 필요
    멤버변수 iv, cv는 자동초기화

    class Init{
    	// 멤버변수(인스턴스 변수, 클래스 변수)는 자동 초기화
    	int x;
    	int y = x; 
        
    	void method() {
    		int i;
    		int j = i; // 에러. 초기화 없이 사용
    	}
    }

    자동초기화 기본값

    자료형 기본값
    boolean false
    char '\u0000'
    byte, short, int 0
    long 0L
    float 0.0f
    double 0.0d 또는 0.0
    참조형 null

     

    2. 멤버변수 초기화

    1) 명시적 초기화 (=)

    // 기본형 변수 초기화
    int door = 4;
    // 참조형 변수 초기화
    Car c = new Car();

    2) 초기화 블럭

    인스턴스 초기화 블럭 {}

    클래스 초기화 블럭 static  {}

    3) 생성자(iv 초기화)

     

    3. 초기화 시점

    클래스 변수 초기화 시점 : 클래스가 메모리에 로딩될 때 단 한번

    인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다

    클래스 변수 초기화 → 인스턴스 변수 초기화

    자동(0)  → 간단(=)  → 복잡(static {}, 생성자)순으로 진행

    728x90
    댓글