IT world

Java 클래스 본문

코딩/Java

Java 클래스

엄킹 2019. 11. 28. 11:58


1. 클래스의 구성 멤버


클래스에는 객체가 가져야 할 구성 맴버가 선언된다. 구성 맴버로는 필드(Field), 생성자(Constructor), 메소드(Method)가 있다.

이 구성 맴버들은 생략되거나 복수 개가 작성된다.



public class ClassName

{

//필드

int fieldName;       ------------------------------------------------------> 필드 : 객체의 데이터가 저장되는 곳


//생성자

public ClassName() { ... } ------------------------------------------------> 생성자 : 객체 생성 시 초기화 역할 담당


//메소드

public void methodName() { ... } ---------------------------------------> 메소드 : 객체의 동작에 해당하는 실행 블록

}





1-1. 필드


필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다. 선언 형태는 변수와 비슷하지만 필드를 변수라고 읽지 않는다.


변수는 새성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 소멸된다. 하지만 필드는 생성자와 메소드 전체에서 사용

되며 객체가 소멸되지 않는 한 객체와 함께 존재하고 객체를 삭제해야 소멸된다.



1-2. 생성자


생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록이다. 


생성자의 역할은 객체 생성 시 초기화를 담당한다. 필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 한다.


생성자는 메소드와 비슷하게 생겼지만 클래스 이름으로 생성자를 만들고 리턴 타입이 없다.



1-3. 메소드


메소드는 객체의 동작에 해당하는 중괄호 {} 블록이다.


메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행되며 사용자가 입력한 동작을 수행한다.


메소드는 객체 간의 데이터 전달의 수단으로도 사용된다.






2. 필드


객체의 고유데이터, 객체가 가져야할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.


클래스 중괄호 {} 블록 어디서든 존재 할 수 있으며 생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다. 

생성자와 메소드 중괄호 내부에 선언된 것은 모두 로컬변수가 되며 생성자와 메소드의 변수가 되는 것이다. (필드와 다름)


클래스 외부에서 필드를 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야한다. 필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문이다.


//필드를 사용하기 위해서 우선 객체를 생성

ClassName cn = new ClassName();


//객체를 참조하는 변수를 통해 필드를 호출

cn.fileName;







3. 생성자


생성자는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.


객체의 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말한다. 


생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다. 


new연산자에 의해 생성자가 성공적으로 실행되면 힙(heap)영역에 객체가 생성되고 객체의 주소가 리턴된다. 


//생성자 생성

[public] ClassName {


//필드

...


//생성자

[public] 클래스이름 () { ... } // 아무것도 작성하지 않고 매개변수도 없는 상태를 기본생성자라고 하며 작성하지 않아도 자동 생성

}



//main

ClassName cn = new ClassName() // new 다음의 ClassName()이 생성자를 호출 하는 것.



클래스가 public을 사용하여 생성되었다면 생성자에서도 public이 붙지만 클래스가 public 없이 선언되었다면 생성자에도 public이 붙지 않는다. 생성자명은 생성된 클래스의 이름과 동일하다.


클래스를 설계할때 생성자를 생략하면 기본 생성자가 자동으로 생성된다. (사용자가 작성하지 않아도 클래스 자체적으로 기본생성자를 작성함) 그렇기 때문에 클래스에 생성자를 선언하지 않아도 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있는 것이다.


반면 생성자를 사용자가 작성하면 컴파일러는 기본생성자를 추가하지 않는데 사용자가 명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화하기 위해서이다. 



기본 생성자 대신 사용자가 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성


[public] 클래스명 ( 매개변수 선언 , ... )

{

//객체 초기화 코드

필드1 = 매개변수1

...

}


생성자는 메소드와 비슷한 모양이지만 리턴 타입이 없고 클래스 이름과 동일하다.

생성자 블록 내부에는 객체 초기화 코드가 작성되는데 필드 초기값을 저장하거나 메소드를 호출하여 객체 사용전 필요한 준비를 한다.


명시적으로 생성자를 선언했다면 기본생성자를 호출할 수 없다

ClassName cn = new ClassName( number, string ...)   --> 사용가능

ClassName cn = new ClassName( )   --> 사용불가능


[생성자에 대한 예제]



[출력 결과]



* 생성자 오버로딩(overloading)


외부에서 다양한 데이터들을 이용해서 객체를 초기화 하려면 생성자도 다양화될 필요가 있다. 

객체를 생성할 때 외부에서 제공되는 데이터가 없다면 기본생성자로, 외부에서 데이터가 제공되어 객체의 초기값을 주어지면 사용자는 명시적으로 생성자를 선언해야한다.


생성자가 하나뿐이라면 이러한 요구를 수용할 수 없다. 따라서 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공한다.



public class 클래스명 {


public 클래스명() {}

public 클래스명(int n) {}

public 클래스명(int n, double d) {}

public 클래스명(int n, double d, String s) {}

...

}


new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 의해 호출될 생성자가 결정된다.







4. 메소드


메소드도 생성자와 비슷하게 작성되며 생성자와 달리 반환타입을 작성하고 return 값을 받을 수 있다.


//반환타입 메소드이름 ([타입 매개변수 ...]) { ... }


void Print() {...}

double Print(int x, int y) { return sum }


메소드도 생성자와 같이 오버로딩을 지원하고 있으며 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 한다. 


메소드 오버로딩의 조건은 변수의 타입, 개수, 순서중 하나가 달라야 하며 매개값의 타입, 수에 맞게 해당 메소드를 호출한다.


메소드 오버로딩이 필요한 이유느 매개값을 다양하게 받아 처리할 수 있도록 하기 위함이다.


메소드를 호출할 때에는 클래스참조변수에 .을 작성한 후 해당 메소드의 이름을 작성하여 호출하면 된다.

'코딩 > Java' 카테고리의 다른 글

Java 상속  (0) 2019.11.28
객체지향 프로그래밍(OOP)  (0) 2019.11.27
Java - 참조타입1  (0) 2019.11.27
Java란  (0) 2019.11.25
Java - 정수와 실수  (0) 2019.03.14
Comments