Java

이것이 자바다 - 클래스(2)

공부처음하는사람 2024. 6. 21. 16:42

 

리턴 타입

 

- 리턴 타입은 메소드가 실행한 후 호출한 곳으로 전달하는 결과값의 타입을 말한다.

- 리턴값이 없는 메소드는 void로 작성한다.

- 리턴 타입이 있는 메소드는 실행 블록 안에서 return 문으로 리턴값을 반드시 지정해야 한다.

 

매개변수

- 매개변수는 메소드를 호출할 때 전달한 매개값을 받기 위해 사용된다.

- 전달할 매개값이 없다면 매개변수는 생략할 수 있다.

 

메소드 호출

메소드를 호출한다는 것은 메소드 블록을 실행하는 것을 말한다. 클래스에서 메소드를 선언했다고 바로 호출할 수 있는것은 아니다.

메소드는 객체의 동작이므로 객체가 존재하니 않으면 메소드를 호출할 수 없다.

클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 호출될 수 있고, 객체 외부에서도 호출이 가능하다.

 

가변길이 매개변수

메소드를 호출할 때에는 매개변수의 개수에 맞게 매개값을 제공해야한다. 만약 메소드가 가변길이 매개변수를 가지고 있다면

매개변수의 개수와 상관없이 매개값을 줄 수 있다.

int sum(int ... values) {
} //가변길이 매개면수 선언하는법

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

 

매개값들은 자동으로 배열항목으로 변환된다. 그렇기 때문에 메소드 호출 시 직접 배열을 매개값으로 제공해도 된다.

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

int result = sum(new int[] { 1, 2, 3 });

 

 

return 문

return문은 메소드 실행을 강제 종료하고 호출한 곳으로 돌아간다는 의미이다. 메소드 선언에 리턴타입이 있을 경우 

return문 뒤에 리턴값을 추가로 지정해야 한다.

return 문 이후에 실행문을 작성하면 컴파일 에러가 발생한다. 왜냐하면 return문 이후의 실행문은 실행되지 않기 때문

 

메소드 오버로딩

메소드 오버로딩은 메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드 여러개를 선언하는것을 말한다.

package ch06.sec08.exam04;

public class Calculator {

    double areaRectangle(double width) {
        return width * width;
    }

    double areaRectangle(double width, double height) {
        return width * height;
    }
}

 

areaRectangle 메서드로 정사각형의 넓이, 직사각형의 넓이를 두가지를 구할 수 있다.

 

인스턴스 멤버

필드와 메소드는 선언 방법에 따라 인스턴스 멤버와 정적 멤버로 분류할 수 있다. 인스턴스 멤버로 선언되면 객체 생성 후 사용할 수 있고,

정적 멤버 (static)로 선언되면 객체 생성 없이도 사용할 수 있다.

 

public class Car{
// 인스턴스 필드 선언
    int gas;

// 인스턴스 메소드 선언
	void setSpeed(int speed) {...}
}

 

- gas 필드는 객체마다 따로 존재한다.

- setSpeed 메서드는 객체마다 존재하지 않고 메소드 영역에 저장되고 공유된다.

 

인스턴스 멤버는 객체에 소속된 멤버이다. gas 필드는 객체에 소속된 멤버가 분명하지만, setSpeed( ) 메서드는 객체에 포함되지 않는다.

객체에 '소속된' 과 '포함된'을 확실하게 구분해야 한다.

 

메서드는 코드의 덩어리이므로 객체마다 저장한다면 중복으로 인해 메모리 효율이 떨어진다. 따라서 메서드는 메서드 영역에 저장되어

공유해서 사용하고, 이 때 객체 없이는 사용하지 못하도록 제한을 걸어둔 것.

 

정적 멤버 (static)

클래스 로더를 이용해서 클래스를 메소드 영역에 저장하고 사용한다. 정적 (static) 멤버란 메소드 영역의 클래스에 고정적으로

위치하는 멤버를 말한다. 그렇기 때문에 정적 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능하다.

 

객체마다 가지고 있을 필요성이 없는 공용적인 필드는 정적 필드로 선언하는 것이 좋다. 예를들어 Calculator 클래스에서

원의 넓이나 둘레를 구할 때 필요한 파이는 객체마다 가지고 있을 필요가 없으므로 정적 필드로 선언하는것이 좋다.

 

Calculator의 plus 메소드 또한 같은 이유로 정적 메서드로 선언하는것이 좋다. (외부에서 주어진 매개값들을 가지고 처리하므로)

 

정적 멤버 사용

클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 도트연산자로 접근하면 된다.

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

 

정적 블록

 

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

하지만 복잡한 초기화 작업이 필요하다면 정적 블록을 사용해야 한다.

package ch06.sec10.exam02;

public class Television {

    static String company = "SAMSUNG";
    static String model = "OLED";
    static String info;
    
    static {
        info = company + "-" + model;
    }
}

 

company와 model은 선언 시 초기값을 주었고, info는 정적 블록에서 company와 model을 서로 연결해 초기값으로 주었다.

 

인스턴스 멤버 사용 불가

 

정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조변수로 접근해야한다.

package ch06.sec10.exam03;

public class Car {

    int speed;

    void run() {
        System.out.println(speed + "으로 달립니다.");
    }

    static void simulate() {
        Car myCar = new Car();

        myCar.speed = 20;
        myCar.run();
    }

    public static void main(String[] args) {
        simulate();

        Car myCar = new Car();
        myCar.speed = 60;
        myCar.run();
    }
}

 

main() 메소드도 동일한 규칙이 적용된다. main 메서드도 정적 메서드이므로 객체 생성없이 인스턴스 필드와 메서드를 바로 사용할 수 없다. 따라서 객체를 생성 후 사용해야한다.

 

 

'Java' 카테고리의 다른 글

싱글톤  (0) 2024.06.23
Getter / Setter  (0) 2024.06.23
이것이 자바다 - 클래스  (0) 2024.06.19
이것이 자바다 - 열거(Enum) 타입  (0) 2024.06.17
이것이자바다 - 배열  (1) 2024.06.15