Ch07. 메서드와 생성자
메서드 (Method)
- OOP에서 객체의 action(기능) 을 정의하는 부분을 operation이라고 하는데 이 operation을 java에서는 메서드(method) 라고 한다
- 작업을 수행하기 위한 명령문의 집합
- 메서드의 장점 및 작성 지침
- 반복적인 코드를 줄이고 코드의 관리가 용이하다 (재사용성)
- 메서드를 보면 객체가 어떤 일을 하는지 알 수 있다
- 객체가 무슨 일을 해야 할지 정의할 수 있다
- 값을 설정하거나 가져올 수 있다
- 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋으며, 이를 통해 재사용성을 높일 수 있다
메서드 선언
접근제한자 [지정예약어] 결과형_리턴값 메서드명 (매개변수 목록) [throws 예외클래스들] { Access Non-access (return_type) (method_identifier) (Parameter List) (Exception class) modifiers Modifiers method body }
- Method Signature : 메서드와 파라미터 리스트 포함하여 Method Signature라고 하며 모든 메서드에 존재한다
- 접근제한자(Access modifier : 접근제한자는 메서드의 접근 유형으로 4 가지의 접근제한자를 제공한다
- public : 모든 클래스에서 메서드에 접근할 수 있다
- private : 메서드가 정의된 클래스에서만 접근할 수 있다
- protected : 동일한 패키지 또는 다른 패키지의 하위 클래스내에서 메서드에 접근할 수 있다
- default : 메서드 선언시 접근제한자를 지정하지 않으면 java에서는default 접근제한자를 지정하며, 동일한 패키지에서만 볼 수 있다
- 비접근제한자(Non-access modifier : static 과 같은 키워드를 사용할 수 있다
- 결과형 리턴값
- 메서드 실행 후 결과를 호출한 곳으로 되돌려 주는 값
- void(결과가 없을때 , 자료형(boolean, int, String 등 , 클래스나 인터페이스 등을 넘겨줄 수 있다
- return 예약어 사용
- 메서드명 : main 메서드를 제외하고 사용자가 임의로 정하며, 메서드의 기능과 일치해야 한다. 메서드는 메서드 이름으로 호출된다
- 매개 변수 목록 : 메서드의 코드를 수행하기 위해 필요한 변수로 메서드 호출시 필요한 값을 넘겨 줄 수 있다. 쉼표로 구분되고 ( 로 묶인다. 여기에는 데이터 유형과 변수 이름이 포함된다
- 예외클래스 : 메서드 내부에 예외가 발생할 경우 그 예외를 Calling method에 위임하기 위해 사용
- 메서드 본문(method body : 이 메서드가 수행할 모든 작업이 포함된다. 중괄호( { } 블럭안에 구현한다
- 메서드 이름 명명규칙
- 동사이며선 소문자로 시작한다
- 메서드 이름이 두 단어 이상인 경우 첫번째 단어를 제외하고 각 단어의 첫글자는 대문자여야 한다
- 예 sum() , areaOfCircle()
return문
- 메서드가 정상적으로 종료되는 경우
- 메서드의 블럭( 의 끝에 도달했을 때
- 메서드의 블럭( 을 수행 도중 return문을 만났을 때
- return 문
- 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다
- 반환값이 없는 경우(void : return 문을 생략하거나 작성해주면 된다 예) return;
- 반환값이 있는 경우 : return 문 뒤에 반환값을 지정해 주어야 한다 예) return 반환값;
return 문 주의사항
- return 값이 있는 메서드는 모든 경우에 return문이 있어야 한다
- return 받는 변수는 return type하고 동일한 type 이거나 큰 상위 type 이어야만 한다
- return 문의 개수는 최소화하는 것이 좋다
Worker methode & Calling method
- 지금까지의 예제는 main method에 모든 action을 정의했다면 이제 부터는 task-specific한 method에 선언하고 정의해야 한다
- main method에 모든것을 정의하게 되면 method하나로 모든걸 처리 하기 때문에 simple 한것 같지만 단점이 있다
- 비실용적이고 사이즈만 커져버린 application이 되버린다
- OO(Object-Oriented) 을 사용하지 않았다
- 재사용하기 힘들다
- Calling method는 기능을 호출하는 method, 호출되어 기능을 수행하는 method를 Worker method 라고 한다
메서드 유형
- Java에서는 두 가지 유형의 메서드가 있다 (Predefined Method, User-defined Method)
- Predefined Method (사전 정의된 메서드 : Java 클래스 라이브러리에 이미 정의된 메서드 를 Predefined Method라고 한다
- standard library method 또는 built-in method 라고도 한다
- length() , equals() , sqrt() , print() 등은 별도 선언 없이 바로 사용할 수 있다
- max() 메서드의 Java API Document를 보면 접근 제한자 public, 지정 예약어 static, 리턴 데이터 유형 int, 메서드 이름 max() , 매개변수 목록 (int a, int b) 이 있다
- User-defined Method (사용자 정의 메서드 : 어떤 요구사항이나 필요에 의해 프로그래머 가 개발한 메서드를 사용자 정의 메서드라고 한다. 이런 메서드는 비즈니스 요구사항이 변경 되면 같이 변경된다
메서드 - Passing Arguments
- Argument(매개변수 는 메서드에게 어떤 값을 전달할 때 사용한다
- 매개변수는 리터럴(literal 또는 변수(variable 가 될 수 있다
* User-defined Method
Object method(instance method)와 Static method
- Object method(instance method
- Object method는 object를 생성해야만 호출할 수 있다
- Object method는 instance method라고도 하며, 메서드 내에서 인스턴스 변수를 사용할 수 있다
- Object method는 “참조변수명.method명( ” 으로 접근한다
- Static method(class method
- object를 생성하지 않고 호출할 수 있으며 class method라고도 불린다
- 클래스의 인스턴스가 아닌 클래스에 속하는 메서드이다
- Static method는 method 정의시 static keyword를 사용한다
- Java API중에도 Static method들이 존재한다. (예: Math.random(
- object의 생성 없이도 접근이 가능한 method를 정의할 때 사용한다(예를 들자면 Utility class의 문자변환 기능, 날짜 변환 기능 등
- static 멤버(변수,메서드 에 접근하고 값을 변경할 수 있으며, 대표적인 static method로 main( 메서드가 있다
- Static method는 “클래스명.method명( ” 으로 접근한다
- Statid method 예 : Date today = Util.getDate( ; <- static method
- Object method는 Accessor method, Mutator method 두 가지 유형이 있다
- Accessor method(접근자 메서드
- 인스턴스 변수를 read하는 메서드이다. 메서드 앞에 get 단어가 붙어서 쉽게 식별할 수 있으며, getter라고도 한다
- private 변수의 값을 반환한다 예) public int getNumber( { return number; }
- Mutator method (설정 메서드
- 인스턴스 변수를 값을 수정하는 메서드로 메서드 앞에 set 단어가 붙기 때문에 쉽게 식별할 수 있다. setter라고도 한다
- 반환값이 없으며, 동일한 데이터 타입의 매개변수를 허용하여 private 변수의 값을 설정하는데 사용된다
- 외부에서 값을 변경할 필요가 없는 불변(immutable 객체의 경우 setter 메서드를 만들면 안된다(예 : 주소객체 등과 같은 생성 후 값이 변하지 않는 객체 예 public void setNumber( int number { this. number = number;
- Accessor method, Mutator method 예)
- Static method 예제
- 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없고 static은 static 간에 참조나 호출이 가능하다
- static method 영역은 객체 생성 없이 접근할 수 있지만 Object method 는 객체 생성이 되어야만 호출될 수 있기 때문에 static 영역에서 호출이 불가능하다
- 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다 (read only)
- 참조형 매개변수 - 변수의 값을 읽거나 변경할 수 있다
- Call by Name
- 이름으로 메서드를 호출하는 방식으로 특정 매개변수 없이 실행
- 이미 결정된 결과를 출력하거나 고정된 실행을 요구하는 것 외에는 다른 기능이 없다
- 예 System.out.println() ;
- Call by Value
- 이름으로 메서드를 호출할 때 특정 매개변수를 전달하여 그 값을 이용해 실행
- 매개변수는 개수 제한, 자료형 제약이 없다
- 예) System.exit(1) ;
- Call by Reference
- 메서드 호출 시 매개변수로 사용되는 값이 특정 위치를 참조
Pass by Value/ Pass by Reference
- 자바는 값을 인자에 의해서만 전달한다
- 한 객체의 인스턴스가 메소드의 인자로 전달될 때 그 인자의 값은 객체에 대한 레퍼런 스(참조값 이다
- 객체의 내용은 호출된 메소드 내에서 변경될 수 있다. 그러나 객체의 레퍼런스는 절대 변경되지 않는다
- Pass by value : 메서드가 호출되면 호출자는 인수 변수의 복사본을 메서드에 전달하여 메모리에 두 개의 값을 생성한다
- Pass by Reference : 메서드가 호출될 때 메서드 인수는 메모리에서 호출자와 동일한 변수를 참조한다
Pass by Value
- 기본 데이터 타입인 int 타입 foo 변수가 setFoot( 매개변수로 전달되면 메서드 별로 두개 의 스택에 개별 변수가 만들어지면서 foo 변수 값의 복사본이 bar로 전달된다
- setFoo( 메서드안에서 bar 매개변수의 값을 2로 변경한다
public class PassByValueEx1 {
public static void main(String args[]) {
int foo = 1;
System.out.println(foo) ; // 1
// Pass by value
setFoo(foo) ;
System.out.println(foo) ; // 1
}
public static void setFoo(int bar
{ // bar = 1 bar = 2;}}
Pass by Reference
- spill( 메서드가 호출되면 매개 변수는 mugToBeSpilled 매개변수로 객체 참조 변수의 복사본 이 전달됩니다
- spill( 메서드에서는 복사본 참조변수를 통해 contents의 값을 “Nothing"으로 변경한다
- myMug, mugToBeSpilled 두 참조변수 모두 하나의 객체를 바라본다
메서드 오버로딩이란(Method overloading)
- 하나의 Class내에 동일한 이름으로 동일한 작업을 하는 여러 개의 method를 구현 하는 것을 말하며, 다중의 의미를 부여할 수 있다
- 하나의 작업만 수행해야 하는 경우 메서드의 이름이 동일하면 프로그램의 가독성 이 높아지고, 기능은 동일하나 매개변수 목록이나 타입에 따라 호출되는 메서드를 제어하고자 할 경우 사용된다
- argument의 개수가 다르거나 argument의 자료형이 다른 동일한 이름의 method를 구현한다
- 오버로딩 조건
- 메서드 이름이 동일해야 한다
- 매개변수의 개수 또는 타입이 달라야 한다
- return type, modifier는 오버로딩 조건에 영향을 미치지 않는다
- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩 조건이 되지 않는다
- 오버로딩의 예
- PrintStream class의 print 와 println method
- 매개변수를 다르게 하거나 타입을 변경하여 메서드 오버로딩을 구현한 예
생성자(Constructor)란?
- 생성자는 클래스의 인스턴스 생성에 사용되며, 객체가 생성될 때 멤버변수들의 값을 초기화 하는 기능을 한다
- 클래스가 생성자 선언을 하지 않으면, 매개변수가 없는 디폴트 생성자(default constructor 가 자동으로 제공된다
- 기본 생성자는 데이터 타입에 따라 0, null과 같은 객체의 기본값을 제공하기위해 사용된다
- 디폴트 생성자는 컴파일러에 의해 제공되며 암묵적으로 public이 접근제한자로 선언된다
- 생성자는 메소드와 흡사하지만 메소드는 아니다
- 생성자는 메소드 호출방식으로 호출될 수 없으며, 인스턴스 생성시점에만 호출 된다
- 생성자는 항상 객체를 잠그고, 객체의 모든 생성자 작업을 마칠 때까지 다른 스레드에서 이를 정상적으로 사용할 수 없도록 한다
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다
- 생성자를 호출할 때 객체에 대한 메모리가 JVM Heap 메모리 영역에 할당 된다
- new 키워드를 사용하여 객체를 생성할 때마다 생성자가 호출된다
- 생성자는 매개변수가 없는 생성자와 있는 생성자 두 개로 나뉜다
생성자 작성 규칙
- 생성자의 이름은 클래스의 이름과 같아야 한다
- 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다
- 생성자의 접근제한자로는 public, protected, private를 선언할 수 있으며, 접근제한자가 없다면 default 접근제한자로 선언된다
- 생성자에는 abstract, static, final, synchronized 키워드를 사용할 수 없다
- 생성자가 오버로딩된 다른 생성자를 호출할 수 있다
- new 라는 keyword를 이용해서 객체를 생성할 때 자동적으로 default constructor가 호출 된다 ▶ Person person = new Person() ;
● 기본 문법
클래스이름(타입 변수명, 타입 변수명, … )
{ // 주로 인스턴스 변수의 초기화 코드를}
생성자 오버로딩
- 생성자를 오버로딩한 경우 기본 생성자(default constructor 를 호출하여 객체를 생성하고자 할 경우에는 컴파일러가 자동으로 생성해주지 않기 때문에 기본 생성자를 클래스에 명시적으로 구현해야 한다
- 생성자의 오버로딩은 메서드 오버로딩과 동일한 방식으로 구현한다
- 다른 매개변수 리스트를 가지는 생성자들로 구성하며, 매개변수 수와 유형에 따라 컴파일러에 의해 구분된다
Copy 생성자
- Java에서 자사 생성자는 없지만 한 객체에서 다른 객체로 값을 복사하는 방식을 처리할 수 있다.
public class CopyConstructorEx1 {
int id;
String name
; CopyConstructorEx1(int i,String n){
id = i;
name = n; }
//constructor to initialize another object
CopyConstructorEx1(CopyConstructorEx1 originObj){
id = originObj.id;
name = originObj.name; }
void display(){
System.out.println(id+" "+name);
}
public static void main(String args[]){
CopyConstructorEx1 obj = new CopyConstructorEx1(123,"홍길동");
CopyConstructorEx1 copyObj = new CopyConstructorEx1( obj );
obj.display();
copyObj.display(); } }
생성자와 메서드의 차이점
- 생성자와 메서드의 주요 차이점은 return type이 없고, 사용 용도가 다르며, 호출 시점이 다르다는 것이다