공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

오버로딩(Overloading)

  한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버 로딩(Method Overloading)또는 간단히 오버로딩이라고 한다. 

 

 

오버로딩의 조건과 장점

오버로딩의 조건

1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.

오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있고 반환 값으로는 안된다.

 

int add(int x, int y){ return x + y; }
int add(double x, double y){ return x + y; }

//매개변수의 순서가 다른경우에도 오버로딩으로 간주한다
long add(int x, long y){ return x + y; }
long add(long x, int y){ return x + y; }

  예를 들어 매개변수를 서로 더하는  add( ) 메서드를 만들 때 매개변수의 타입이 정수형이냐 실수형이냐에 따라 함수를 다른 이름으로 한다면 복잡하고 사용하기도 불편할 것이다. 그럴 때 위의 코드처럼 오버로딩을 한다면 함수 이름 하나로 여러 가지 입력을 받을 수 있게 만들 수 있다. 이처럼 같은 일을 하지만 매개변수를 달리해야 하는 경우에 오버 로딩을 구현한다.

 

 

 

가변인자(varargs)와 오버로딩

  기존에는 메서드의 매개변수가 고정이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 되었다. 이 기능을 가변 인자(variable arguments)라고 한다. 가변 인자는  타입... 변수명 과 같은 형식으로 선언하고 가변 인자 외에도 매개변수가 더 있다면 가변 인자를 제일 마지막에 선언해야 한다. 가변 인자를 사용하면 인자가 아예 없어도 되고 배열도 인자가 될 수 있다. 가변 인자는 내부적으로 배열을 이용하는 것이기 때문에 가변 인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성되어 비효율적인 면이 있고, 가변 인자를 선언한 메서드를 오버 로딩하면 구별되지 못하는 경우가 발생하기 쉽기 때문에 주의해야 한다. 가급적 필요할 때만 사용하는 것이 좋다. 

 

 

 

 


생성자(Constructor)

클래스이름(타입 변수명, 타입 변수명, ...){
	// 인스턴스 생성시 수행될 코드, 주로 인스턴스 변수의 초기화 코드를 적는다.
}

//예시
class Student{
	Student(){	//생성자
    	...
    }
    
    Student(String name, int num){	//생성자, 오버로딩이 가능하다.
    	..
    }
}

 

생성자의 조건

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.

  생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 인스턴스 변수의 초기화 작업에 주로 사용되며 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다. 생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴 값이 없다는 점이 다르다. 리턴 값이 없다고  void 를 쓰지도 않고 그냥 아무것도 안 적는다. 생성자도 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다. 인스턴스를 생성하기 위해 사용하는  클래스이름( ) 이 바로 생성자이다. 연산자  new 가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

 

 

  1. 기본 생성자(Default Constructor)

클래스이름() { }

  모든 클래스에는 반드시 하나이상의 생성자가 정의되어있어야 한다. 컴파일할 때 소스파일(*. java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 위와 같이 매개변수도 없고 내용도 없는 기본 생성자를 추가하여 컴파일한다. 주의할 점은 컴파일러가 자동으로 기본 생성자를 추가해주는 경우는 클래스 내에 생성자가 하나도 없을 때뿐이라는 것이다.

 

 

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

  생성자도 오버 로딩이 가능해서 기본 생성자처럼 매개변수도 없고 내용도없는 기본 생성자도 있지만 매개변수를 가지고 인스턴스를 원하는 값으로 초기화시켜주는 생성자도 있다. 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다. 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 하는 것이 바람직하다.

 

 

 

생성자에서 다른 생성자 호출하기 - this( ), this

  같은 클래스 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 하지만 아래의 두 가지 조건을 만족시켜야 한다.

 

1. 생성자의 이름으로 클래스이름대신  this 를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

  생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면 호출된 다른 생성자 내에서도 멤버 변수들의 값을 초기화를 해버리므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.

 

 

Student(String name, int num){
    this.name = name;	//this는 참조변수로 인스턴스 자신을 가리킨다.
    this.num = num;
}

  생성자의 매개변수로 인스턴스 변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스 변수의 이름이 일치하는 경우가 자주 있다. 이때는  this 를 사용해서 구별해 주는 것이 좋다.  this 는 참조 변수로 인스턴스 자신을 가리킨다.  this 로 인스턴스 변수에 접근할 수 있다. 또한  this 는 인스턴스 멤버만 사용할 수 있다. static메서드(클래스 메서드)에서는 인스턴스 멤버들을 사용할 수 없는 것처럼 this 역시 사용할 수없다.(static메서드는 인스턴스를 생성하지 않고도 호출될 수 있기 때문에 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.)

 

 

 this  this( )  요약

this : 인스턴스 자신을 가리키는 참조 변수, 인스턴스의 주소가 저장되어있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
this( ), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

 

 

 

생성자를 이용한 인스턴스의 복사

Student(Student s){
    name = s.name;
    number = s.number;
}

  현재 사용하고 있는 인스턴스와 같은 상태(모든 인스턴스 변수가 동일한 값을 갖는 것)를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다. 위의 코드는 매개변수로 넘겨진 참조 변수가 가리키는  Student 인스턴스의 인스턴스 변수인  name  number 을 인스턴스 자신으로 복사하는 것이다. 

 

 

인스턴스를 생성할 때 고려해야 할 점

1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

 

 

 

 


변수의 초기화

  변수를 선언하고 값을 지정하는 것을 변수의 초기화라고 한다. 멤버 변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화되지만 지역변수는 사용하기 전에 반드시 초기화를 해야 한다.

 

  [참고] 각타입의 기본값(default value)

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

 

  1. 명시적 초기화

  변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다. 간단하지만 복잡한 초기화 작업이 필요할 때는 초기화블럭(initialization block)또는 생성자를 사용해야 한다.

 

 

  2. 초기화 블럭(initialization block)

클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용된다.
인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용된다.

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다. 또한 인스턴스 초기화블럭은 생성자보다 먼저 수행된다. 보통 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통적으로 수행되어야 하는 코드를 넣는데 사용한다.

 

class Student{
	static {	//블럭앞에 static을 붙이면 클래스 초기화 블럭이 된다.
    	//클래스 초기화 블럭
    }
    {	//인스턴스 초기화 블럭	}
}

블럭 {  } 앞에  static 이 붙으면 클래스 초기화블럭이 되고 붙지않으면 인스턴스 초기화 블럭이 된다.

 

 

 

 

멤버 변수의 초기화 시기와 순서

클래스변수의 초기화 시점 : 클래스가 처음 로딩될때 단 한번 초기화
인스턴스 변수의 초기화 시점 : 인스턴스가 생성될때마다 각각의 인스턴스별로 초기화

클래스변수의 초기화 순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭
인스턴스변수의 초기화 순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자

 

 

 

+ Recent posts