상세 컨텐츠

본문 제목

자바강좌 - 네번째 ( 클래스 메서드, 인스턴스 메서드, 생성자, 변수의 초기화)

자바강좌

by somiyuralove 2019. 3. 10. 04:11

본문

이번시간에는 클래스 메서드와 인스턴스 메서드에 대해서 알아보겠습니다.


클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고 클래스이름.메서드이름 형식으로 호출하여 사용할 수 있습니다.


인스턴스 메서드는 인스턴스 변수와 마찬가지로, 인스턴스 변수를 사용하는 인스턴스 메서드도 인스턴스를 생성해야지만 사용할 수 있습니다.


보통 클래스를 설계할때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙여줍니다.


클래스변수(static)은 인스턴스를 사용하지 않고도 사용할 수 있고, 클래스 메서드는 인스턴스 변수를 사용할 수 없습니다.


왜냐하면 클래스 메서드는 클래스가 메모리에 올라가 있으면 바로 사용할 수 있지만 인스턴스가 생성되어야지만 사용할 수 있는 인스턴스 변수는 클래스 메서드가 메모리에 올라가서 사용할 수 있을때 꼭 인스턴스가 생성되었다고 보장할 수 없기 때문입니다.


다음으로 클래스 멤버와 인스턴스 멤버간의 참조와 호출에 대해서 알아보겠습니다.


같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조또는 호출이 가능합니다. 단, 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스가 생성되어져야 합니다.


아래의 코드를 보고 참조와 호출의 관계를 음미해 보시기 바랍니다.


18라인을 보면 static 메서드에서 인스턴스메서드를 호출하는것이 불가능 하다는 것을 확인하실 수 있습니다.


아래의 코드도 한번 보시겠습니다.


13라인을 보시면 아시겠지만, 클래스 메서드에서 인스턴스 변수를 참조할 수 없다는 것을 확인할 수 있습니다.


요약하자면, 클래스 변수와 클래서 메서드는 언제나 참조 또는 호출이 가능하기 때문에 인스턴스 멤버가 클래스 멤버를 사용하는 것은 오류를 발생하지 않고 사용이 가능합니다. 그리고 클래스 멤버간의 호출이나 참조도 아무런 문제가 없습니다.


반면, 인스턴스 멤버는 반드시 객체를 생성하고 난 후에 사용이 가능하기 때문에 클래스 멤버가 인스턴스 멤버를 참조, 호출하기 위해서는 인스턴스가 생성되어야만 합니다.


다음으로 자바에서 중요한 개념인 method overloading( 메서드 오버로딩 ) 에 대해서 알아보도록 하겠습니다.


자바에서는 하나의 클래스 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있어도 매개변수이 개수 혹은 타입이 틀리면, 동일한 이름을 사용하여 메서드를 정의할 수 있습니다. 이와 같은 것을 메서드 오버로딩이라고 부릅니다.


오버로딩이라는 영어의 사전적 의미는 의미그대로 오버해서 싣는것... 과적해서 싣는것을 의미합니다.


오버로딩의 조건은 아래와 같습니다.


1. 메서드 이름이 동일


2. 매개변수의 개수 혹은 타입이 달라야 함.


3. 매개변수는 같고 리턴타입이 틀린 경우는 오버로딩이 성립하지 않음.


오버로딩의 장점으로는 서로다른 이름을 사용하여 메서드를 만드는 쪽이나 메서드를 이용하는 쪽에서 불편함을 줄기기 위해서입니다.

바꾸어 말하면 메서드를 만드는 쪽에서는 이름을 짓는데 어려움이 있고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억하기가 힘들다는 것입니다.


아래 코드에서 메서드 오버로딩의 예제를 살펴보도록 하겠습니다.



코드를 보시면 별다른 설명없이도 금방 이해하실 수 있으리라 생각되어집니다. ^^;;;


그다음으로 생성자(constructor)에 대하여 알아보도록 하겠습니다.


생성자는 인스턴스가 생성될때 호출되는 인스턴스 초기화 메서드입니다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성시에 실행되어야 할 작업을 위해서도 사용됩니다.


생성자 역시 메서드처럼 클래서 내에서 선언되며, 구조도 메서드와 유사하지만 리턴값이 없고, 생성자의 이름은 클래스의 이름과 같아야합니다.


인스턴스를 생성할때는 반듯이 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해 주어야합니다.


계속해서 기본생성자(default constructor)에 대해서 알아보도록 하겠습니다.


우리는 지금까지 생성자를 모르고도 클래스를 인스턴스화해서 사용하였는데, 사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어야 합니다.


그런데 개발자가 따로 생성자를 정의하지 않고 컴파일을 하면 컴파일러는 디폴트로 기본생성자를 생성해줍니다.


컴파일러가 기본적으로 생성자를 생성해주었으므로 우리는 컴파일 오류없이 클래스에서 객체를 생성할 수가 있었습니다.


디폴트 생성자의 생김새는 ' 클래스이름() {} ' 와 같은 형식입니다.


그러므로 아래와 같이 사용한다면 컴파일 에러가 발생합니다. 아래 코드를 보시죠.


15라인에서는 Data1 클래스에 명시적으로 생성자를 만들어주지 않았기 때문에 기본생성자(default constructor)를 컴파일러가 생성해주어 정상적으로 객체를 생성할 수 있지만, 16라인에서는 Data2가 매개변수가 있는 생성자가 선언되어 있기때문에 매개변수가 없는 생성자로 호출하게 되면 에러가 발생합니다.


생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화작업에 사용할 수 있습니다.

인스턴스마다 각기 다른 값으로 초기화되어야하는 경우가 많기때문에 매개변수를 사용한 초기화는 매우 유용합니다.

아래의 예제 코드를 보시기 바랍니다.


코드는 평이하기 때문에 충분히 이해가능 하실 것이라고 생각되어지며, 24라인에서 매개변수가 있는 생성자를 호출하는 코드를 보실 수 있습니다.


그리고, 생성자 간에 서로 호출이 가능한데, 생성자의 으름으로 클래스 이름대신 this를 사용하며 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능합니다.


아래 코드를 보시고 이해를 해보시기 바랍니다.


그리고, 생성자를 이용한 인스턴스의 복사를 알아보겠습니다.

현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할때 생성자를 이용하면 됩니다.


아래 코드를 보시면 이해가 빠르실것입니다.



마지막으로 변수의 초기화 방법에 대해서 알아보겠습니다.


1. 명시적 초기화 (explicit initialization)


2. 생성자 ( constructor )


3. 초기화 블럭 ( initialization block ) : 인스턴스 초기화 블럭, 클래스 초기화 블럭


3가지 초기화중에 멤버변수의 초기화는 명시적 초기화로 초기화 시키는게 가장 일반적이고 확실한 방법이라고 생각됩니다.


저의 글이 도움이 되셨다면 공감버튼을 눌러주시길 부탁드립니다.

공감버튼은 로그인하지 않으셔도 누르실수가 있어요.^^


관련글 더보기

댓글 영역