Java_11일 자동차 기록

  • by

가변 길이 파라미터(varargs)

: 파라미터 수에 관계없이 파라미터를 제공할 수 있습니다

int sum(int ... values) {
}

int result = sum(1, 2, 3);
int result = sum(1, 2, 3, 4, 5);

가변 길이 파라미터는, 메소드 호출시에 파라미터를 콤마로 단락지어, 수에 관계없이 제공할 수 있습니다.

int() values = {1, 2, 3};
int result = sum(values);

//위 코드를 아래 코드와 같이 한번에 작성 가능
itn result = sum(new int() {1, 2, 3});

매개 변수는 자동으로 배열 항목으로 변환되어 메서드에서 사용됩니다.

따라서, 메소드 호출시에 직접 배열을 파라미터로서 제공 가능

//가변길이 매개변수는 파라미터 목록에서 가장 오른쪽에 작성해야 함
void method4(String param, double d, int... values) {...}

return 문

1) 메서드 실행을 강제 종료하고 호출한 위치로 돌아가기

반환 문 다음에 실행 문을 만들 때 “Unreachable code”라는 컴파일 오류가 발생합니다.

이유는 return 문 이후의 실행 문은 결코 실행되지 않기 때문에

int plus(int x, int y) {
	int result = x + y;
    return result;
    System.out.println(result); //Unreachable code 에러 발생
}

※ 다만, if문의 조건식이 false가 되면 성공적으로 다음의 코드가 실행되기 때문에, 이하의 코드는 에러가 발생하지 않는다

boolean isLeftGas() {
	if (gas == 0) {
    	System.out.println("gas가 없습니다.

"); return false; } System.out.println("gas가 있습니다.

"); //false일 경우 해당 코드 실행 return true; }

2) return 문의 오른쪽 값을 호출 한 위치로 반환합니다 (단, 오른쪽 값은 메서드의 반환 형식과 일치해야 합니다)

		int method2() {
		// 메소드 리턴 타입을 명시하면 해당 타입의 값을 꼭 리턴해야 함
		if (true) {
			return 3; // if문 때문에 return할 수 없을 수도 있다고 판단해서 오류 (꼭 리턴해야 함)
		}
		
		return 5;

※단, 자동형 변환이 가능하고 일치하지 않아도 에러를 발생하지 않는 경우가 있다

// 자동 형변환
	int method5() {
		short a = 6000;
		
		return a; //자동 형변환
	}
    
    double method7() {
		long l = 33;
		return l; //자동 형변환
	}
    
//		int method4() {
//		long a = 3L;
		
//		return a; // 오류 발생, long 타입은 int 타입으로 자동 형변환 불가하기 때문
//	}

3) 메소드 선언에 리턴 유형이 있으면 return 문 다음에 리턴 값 추가

로리턴 타입이 없는 경우 void로 반환 유형을 지정해야 합니다.

	// 리턴이 없으면 void로 리턴 타입 명시
	void method8() {
		
		return; //만약 쓴다면 메소드 종료 역할로만 사용 가능
	}


인스턴스 멤버 instance member

: 인스턴스 멤버는 오브젝트 작성 후 사용 가능

오브젝트에 속하는 멤버(오브젝트를 작성하지 않으면 사용할 수 없는 멤버)

인스턴스 멤버 선언 및 사용

public clas Car {
	//인스턴스 필드 선언
    int gas;
    
    //인스턴스 메소드 선언
    void setSpeed(int speed) { ... }
}

– 외부 클래스에서 사용하려면 먼저 객체를 만들고, 참조 변수로 액세스사용해야

Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);

Car yourCar = new Car();
yourCar.gas = 20;
yourCar.setSpeed(80);


출처: https://kephilab.

▲위의 코드가 실행된 후의 메모리 상태를 나타내는 그림

gas 필드는 각 개체에 대해 별도로 존재합니다.

* 인스턴스 멤버는 객체에 속한 멤버/여기서 “객체에 속한다”를 객체에 “포함”으로 해석합니다.

〴 메소드는 코드의 덩어리로서 오브젝트 별로 보존하는 경우, 중복 보존에 의한 메모리 효율의 저하

따라서, 메소드 코드는 메소드 영역에 두고 공유해 사용해, 이 때 오브젝트 없이는 사용할 수 없도록 제한합니다.

this 키워드

: 참조 변수 대체할 키워드, 객체 내부이제 instance member에 액세스하기 위해 this를 사용할 수 있습니다.

〴 객체 자체 “this” 와 표현

생성자 및 메서드의 매개 변수 이름이 인스턴스 필드 이름과 같은 경우, 인스턴스 필드임을 강조원할 때 이것을 주로 사용

	// instance field
	String name;
	
	// instance method
	void printName() {
		String name = "park";
		
		System.out.println(name); // local variable
		System.out.println(this.name); // instance field
	}
	
	void setName(String name) {
		//필드의 name 값을 바꿀 용도로 만들었다면
		//파라미터 name을 필드 name에 할당하기 위해서는 this 사용
		this.name = name;
	}
public class Car {
	//필드 선언
	String model;
	int speed;
	
	//생성자 선언
	Car(String model) {
		this.model = model; //매개변수를 필드에 대입(this 생략 불가)
	}
	
	//메소드 선언
	void setSpeed(int speed) {
		this.speed = speed; //매개변수를 필드에 대입(this 생략 불가)
	}
	
	void run() {
		this.setSpeed(100);
		System.out.println(this.model + "가 달립니다.

(시속:" + this.speed + "km/h"); } //this 모두 생략 가능 }


정적 멤버 Static member


출처: https://kephilab./

– Java는 클래스 로더를 사용하여 클래스를 메소드 영역에 저장하고 사용합니다.

정적 멤버런 메소드 영역의 클래스에 고정에 위치한 회원

– 정적 멤버는 개체를 만들 필요 없음 수업을 통해 즉시 이용 가능

클래스에 고정된 멤버(객체 없이 사용할 수 있는 멤버)

정적 멤버 선언

– 정적 필드/정적 메소드 static 키워드 추가할 수 있는

public class 클래스 {
	//정적 필드 선언
    static 타입 필드 (=초기값);
    
    //정적 메소드
    static 리턴타입 메소드(매개변수, ... ) {...}
}

– 각 개체마다 가질 필요가 없습니다.

퍼블릭 필드정적 필드로 선언하는 것이 좋습니다.

public Class Calculator {
	 String color;               //계산기별로 색깔이 다를 수 있다.

static double pi = 3.14159; //계산기에서 사용하는 파이값은 동일하다.

}

– 인스턴스 필드를 사용하지 않는 메서드는 정적 메서드로 선언하는 것이 좋습니다.

예를 들어, 아래의 코드에서, 예를 들어 plus() 메소드는 외부로부터 주어진 파라미터를 가지고 처리하므로, 정적 메소드로서 선언합니다

인스턴스 필드인 color를 변경하는 setColor() 메서드는 인스턴스 메서드로 선언합니다.

public class Calcultor {
	String color;                                      //인스턴스 필드
    	void steColor(String color) {this.color = color;}  //인스턴스 메소드
    	static int plus(int x, int y) {return x + y;}      //정적 메소드
    	static int minus(int x, int y) {return x - y;}     //정적 메소드
}

정적 멤버 사용

– 클래스가 메모리에 로드되면 정적 멤버를 즉시 사용할 수 있습니다.

클래스 이름과 함께 점(.) 연산자가까이 가면

double result1 = 10 * 10 Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5)

– 정적 필드와 정적 메소드는 객체 참조 변소에서도 액세스 가능하지만, 정적 요소는 클래스 이름으로 액세스하는 것이 정석

– Eclipse에서 정적 멤버를 객체 참조 변수로 액세스하면 경고를 표시합니다.

정적 블록

– 정적 필드는 필드 선언과 동시에 초기값을 주는 것이 일반적

static double pi = 3.14159;

– 복잡한 초기화 작업 필요한 경우 정적 블록(static block)을 이용

static {
  ...
}

– 정적 블록은 클래스가 메모리에 로드될 때 자동으로 실행됩니다.

– 정적 블록이 클래스에 여러 선언된 경우 선언된 순서로 실행

※정적 필드는 오브젝트 생성 없이 사용할 수 있기 때문에 생성자로 초기화 작업을 하지 않는다※

(생성자는 객체 생성 후 실행되기 때문에)

인스턴스 멤버 비활성화

– 정적 메서드와 정적 블록은 객체가 없어도 실행된다는 특징으로 인해 내부에 인스턴스 필드나 인스턴스 메서드를 사용할 수 없다.

– 또, 오브젝트 자신의 참조인 this도 사용 불가

ㅁ instance 멤버끼리 액세스 가능

ㅁstaic 멤버끼리 접근 가능

ㅁ instance 멤버가 static 멤버에 액세스 가능 (ex.실차를 설계도대로 변경 가능)

ㅁstaic 멤버는 instance 멤버에 액세스할 수 없습니다(ex.

	// instance field
	String name;
	
	// static field
	static String model;
	
	// instance method
	void printName() {
		System.out.println(model);
		System.out.println(name);
	}
	
	// static method
	static void printModel() {
		System.out.println(model);
		
	// static member는 instance member에 접근 불가
//	System.out.println(name); //안됨

– 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하려면 먼저 오브젝트를 작성하고 참조 변수로 액세스하십시오.

public class ClassName {
	//인스턴스 필드와 메소드 선언
    int field1;
    void method1() { ... }
    
    //정적 메소드 선언
	static void Method3() {
 	//객체 생성
 	ClassName obj = new ClassName();
 	//인스턴스 멤버 사용
 	obj.field1 = 10;
 	obj.method1();
 }

– main() 메서드도 정적 메서드이므로 객체를 생성하지 않고 인스턴스 필드와 인스턴스 메서드를 즉시 사용할 수 없습니다.

public class Car {
	//인스턴스 필드 선언
    int speed;
    
    //인스턴스 메소드 선언
    void run() {...}
    
    //메인 메소드 선언
    public static void main(String() args) {
    speed = 60; //컴파일 에러
    run();      //컴파일 에러
    
    //객체 생성
    Car myCar = new Car();
    //인스턴스 멤버 사용의 올바른 방법
    myCar.speed = 60;
    myCar.run();
    }
}


final 필드와 상수

final 필드 선언

: final은 ‘최종’이고 final 필드는 초기값이것이 저장되면, 최종 값프로그램이 실행 중입니다.

변경할 수 없음

final 타입 필드 (=초기값);

– 값을 한 번만 할당할 수 있으며 0번 할당할 수 없습니다.

무조건 한 번 값을 할당해야 함

(final 필드에 초기 값을 할당하는 방법)

①필드 선언 시 초기값 대입

② 생성자에 초기값 대입

상수 선언

: 불변값저장하는 필드를 자바로 상수라는

(불변의 값은, 수학에서 사용되는 원주율의 파나 지구의 무게나 원주 등이 있습니다)

static final 타입 상수 (= 초기값);

// 정적 블록 내에서 초기화
static final 타입 상수;
static {
	상수 = 초기값;
}

로 초기화 값은 선언시에 주는 것이 일반적이거나 복잡한 초기화가 필요한 경우 정적 블록으로 초기화할 수도 있다.

상수선언할 때 static final 키워드 사용

– 상수 작성 관습은 SNAKE_CASE -> ex. Integer.MIN_VALUE)

	static int k;
	
	// static final : 상수
	final static int L = 99; //final static
	static final int M = 100; // static final 의 변수명은 SNAKE_CASE

– 상수는 정적 필드이므로 클래스에서 액세스하고 읽을 수 있습니다.

클래스 이름.상수 )

public class Earth {
	//상수 선언 및 초기화
	static final double EARTH_RADIUS = 6400;
	
	//상수 선언
	static final double EARTH_SURFACE_AREA;
	
	//정적 블록에서 상수 초기화
	static {
		EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	}
}
public static void main(String() args) {
		//상수 읽기
		System.out.println("지구의 반지름: " + Earth.EARTH_RADIUS + "km");
		System.out.println("지구의 표면적: " + Earth.EARTH_SURFACE_AREA + "km^2");
	}