반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

이번 포스팅은 메서드나 생성자로 값을 전달하는 방법에 대해 알아본다.

클래스 (Classes)

메서드 또는 생성자 값 전달(Passing Information to a Method or a Constructor)

메서드나 생성자를 만들 때 인수(arguments)의 개수나 타입을 선언한다.

public int computePay(int a, int b, int c){

int k = a + b;

int j = a – b + c;

return k+j;

}.

이 메서드를 보면 인수가 int3개를 선언했다. 해당 인수를 받아서 메서드 구현부에서 해당 파라미터를 바로 사용을 하고 있다.

메서드 선언부에 입력 받는 변수 3개는 파라메터(parameters)라고 하고 해당 파라미터의 수와 타입에 맞게 실제 값을 넣는데 그 값을 인수(arguments)라고 한다. 그래서 메서드를 호출할 때는 반드시 파라미터 수와 타입에 맞게 인수를 지정해야 한다.

파라메터 타입(Parameter Types)

메서드나 생성자에서 어떤 데이터 타입이든 파라미터로 사용할 수 있다. 원시데이터 타입, 참조형 데이터 타입 모두 사용 가능하다.

가변인수 (Arbitrary Number of Arguments)

메서드에 varargs라는 가변인수를 사용할 수 있다. 특정한 타입의 파라미터의 개수를 알지 못하는 경우에 사용 가능하다. Varargs(가변인수)를 사용하는 방법은 먼저 메서드에서 가장 마지막 파라미터로 선언을 해야 되고 타입을 쓰고 생략 기호인 을 붙이고 공백 하나 다음에 파라메터 명을 쓰면 된다.

예제를 보면 getTest 메서드에서 int형 가변인수를 사용했다. 특이한 점은 가변 인수 b를 선언했지만 값을 넣지 않아도 오류가 나지 않고 실행된다는 점이다.

가변인수의 특징이다. 즉 있어도 그만 없어도 그만이라는 것이다. 필요하면 사용하고 필요 없으면 사용하지 않아도 된다.

 

위 예제를 보면 가변 인수 b에 배열 int c를 입력했다. 즉 가변인수는 배열처럼 사용된다.

가변인수는 참조형 변수도 사용 가능하다. String 타입이든 객체든 모두 사용 가능한 것이다.

파라메터 이름(Parameter Names)

메서드나 생성자의 파라미터 이름을 정할 때는 그 파라미터에 어울리는 이름을 지정해야 한다. 이 이름은 입력된 인수를 참조해서 메서드 몸체에서 사용된다. 파라메터의 이름은 그 메서드 범위에서 유일해야 한다. 같은 메서드나 생성자에서 같은 이름으로 사용해서는 안 된다.또한 메서드 또는 생성자 내 지역변수도 같은 이름으로 사용하면 안된다.

 

 

메서드의 파라미터 명이 클래스 필드와 이름이 같을 수는 있다. 그림자 변수(Shadow)라고도 하는데 이 그림자 변수는 사용 시 혼동될 수도 있고 특별한 경우에만 사용하도록 한다. 그 특별한 경우는 예를 들어 클래스 변수인 필드를 초기화하거나 값을 설정할 때 해당 기능을 하는 메서드의 파라미터 명이 같으면 동질감이 있어서 사용하기 편하다.

메서드 내에서 해당 클래스의 필드를 바로 사용할 수는 없다. 파라메터와 이름이 같기 때문에 단순히 변수명을 사용하면 파라미터 변수로만 인식된다.그렇다면 필드에 연결되기 위해서는 제한하는 이름을 사용해야 한다. 이 부분은 추후 this 키워드에서 자세히 알아본다.

참조형 데이터 타입 인수 전달(Passing Reference Data Type Arguments)

객체 같은 참조형 파라메터는 값으로 메서드에 전달된다. 이 의미는 메서드가 리턴 될 때 입력되었던 참조값(객체)는 여전히 전의 같은 객체를 참조하고 있다는 의미이다. 그러나 객체의 필드 값은 메서드에서 변경될 수 있다.

메서드에서 객체를 받으면 메서드 내에서 객체의 필드 값을 변경할 수 있다. 또한 new로 객체를 다시 생성했을 경우 그 객체는 영속성이 없다. 이유는 메서드에 들어온 객체는 값으로 들어왔고 변경될 수 없기 때문이다.

다음 포스팅은 객체에 대해 알아본다.

반응형
반응형

[Oracle Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]

[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]

이번 포스팅은 객체지향 프로그램인 자바(Java)에서 사용하는 생성자(Constructor)에 대해 알아본다.

클래스 (Classes)

클래스 생성자(Providing Constructors for your Classes)

클래스(Class)에는 생성자(Constructor)가 있다. 클래스를 이용해서 객체를 생성하는 시점에 생성자는 호출된다. 생성자는 메서드처럼 선언된다. 하지만 이름은 클래스 명과 같아야 하고 반환 타입이 없다. 아래 예를 확인해 보자.

   class TestConstructor{

    private int a;

    private int b;

    private int c;

    public TestConstructor(int aa, int bb, String cc){

       a=aa;

       b=bb;

       c=cc;

      }

   }

   TestConstructor tc = new TestConstructor(1, 2, “Test”);

위 코드에서 생성자는 객체가 생성(인스턴스)되는 시점에 new 키워드에 의해 호출된다. 그리고 클래스에 의해 생성된 tc 객체를 위한 메모리 공간이 생성되고 각 필드의 값이 초기화된다.

클래스는 생성자를 선언하지 않아도 기본적으로 생성자 하나는 가지고 있다. 어떠한 입력값도 없는 빈 생성자이다. 생성자는 1개 이상 구현할 수 있다. 단 입력값이 달라야 한다. 우선 입력값이 전혀 없는 기본 생성자부터 좀 전에 3개의 입력값(int, int String) 타입으로 구현된 생성자가 현재 존재한다.

자바(Java)에서는 메서드(method)의 오버로딩(Overloading)처럼 생성자도 입력값(argument)의 개수와 타입에 따라 여러 개를 생성할 수 있다. 같은 개수나 타입의 생성자를 구현하면 자바 플랫폼(platform)은 구별할 수 없게 되어 컴파일 오류가 난다.

 

 

사실 생성자는 클래스 구현할 때 필수적으로 구현하는 건 아니다. 앞서 이야기했던 거처럼 기본 생성자(입력값이 없는)가 존재하기 때문이다. 생성자를 만들지 않으면 컴파일러는 자동으로 기본 생성자를 만들어 준다. 그런데 이 기본 생성자는 슈퍼클래스의 입력값이 없는 생성자를 호출하게 된다. 만약 슈퍼클래스에 입력값이 없는 생성자가 없을 경우 컴파일러는 문제를 제기할 것이고 여러분은 그게 잘 동작하는지 반드시 확인해 봐야 한다. 만약 구현한 클래스에 명확한 슈퍼클래스가 없다면 암묵적으로 Object의 슈퍼클래스에서 입력값이 없는 생성자를 갖게 될 것이다.

자신이 구현한 클래스의 생성자나 슈퍼클래스의 생성자나 프로그래머가 잘 판단해서 사용하면 된다.

다음 포스팅은 메서드나 생성자로 정보를 전달하는 방법에 대해 알아볼 것이다.

반응형