Download presentation
Presentation is loading. Please wait.
1
Java의 정석 제 6 장 객체지향개념 I-2 Java 정석 2008. 6. 5 남궁성 강의 castello@naver.com
Chapter 6. 객체지향개념 I Java의 정석 제 6 장 객체지향개념 I-2 안녕하십니까? 자바의 정석의 저자 남궁성입니다. 지금부터 제6장 객체지향개념1-2에 대한 강의를 시작하겠습니다. 남궁성 강의
2
객체지향개념 I-1 객체지향개념 I-2 객체지향개념 I-3 Java 1. 객체지향언어란? 2. 클래스와 객체
의 정석 Chapter 6. 객체지향개념 I 1. 객체지향언어란? 객체지향개념 I-1 2. 클래스와 객체 3. 변수와 메서드 객체지향개념 I-2 4. 메서드 오버로딩 제6장 객체지향개념1의 두번째 강의입니다. 변수와 메서드 그리고 메서드 오버로딩에 대해서 강의하겠습니다. 5. 생성자 객체지향개념 I-3 6. 변수의 초기화
3
Java 3. 변수와 메서드 4. 메서드 오버로딩(method overloading) 정석 3.1 선언위치에 따른 변수의 종류
Chapter 6. 객체지향개념 I 3. 변수와 메서드 3.1 선언위치에 따른 변수의 종류 3.2 클래스변수와 인스턴스변수 3.3 메서드 3.4 return문 3.5 메서드 호출 3.6 JVM의 메모리구조 3.7 기본형 매개변수와 참조형 매개변수 3.8 재귀호출 3.9 클래스 메서드와 인스턴스 메서드 3.10 멤버간의 참조와 호출 다음과 같은 순서로 강의가 진행될 것인데요. 책의 목차와 다르지않습니다만 강의내용은 다소 강의형식에 맞게 변경하였습니다. 4. 메서드 오버로딩(method overloading) 4.1 메서드 오버로딩이란? 4.2 오버로딩의 조건 4.3 오버로딩의 예
4
Java 의 정석 Chapter 6. 객체지향개념 I 3. 변수와 메서드
5
Java 3.1 선언위치에 따른 변수의 종류 정석 “변수의 선언위치가 변수의 종류와 범위(scope)을 결정한다.”
Chapter 6. 객체지향개념 I 3.1 선언위치에 따른 변수의 종류 “변수의 선언위치가 변수의 종류와 범위(scope)을 결정한다.” class Time { int hour; int minute; int second; } 전에 변수의 타입에 대해서 배웠죠. 변수의 타입은 변수에 저장할 값의 종류에 따라 결정되는데요. 변수의 선언위치에 따른 종류가 또 있습니다. 변수가 어디에 선언되었는가에 따라 변수의 종류와 범위가 결정되는 것이지요. 여기서 범위라는 것은 변수가 유효한 범위, 즉 변수를 사용할 수 있는 범위를 말합니다. 변수의 선언위치에 따라 결정되는 변수의 종류는 세가지, 클래스변수, 인스턴스변수, 지역변수입니다. 클래스 영역은 클래스 블럭... 여기부터 여기까지를 의미하고요. 이 영역에 선언되면 인스턴스변수가 됩니다. 여기에 키워드 static을 붙이면 클래스변수가 되고요. 인스턴스 변수와 클래스 변수는 클래스의 구성요소, 즉 멤버라서 멤버변수라고 합니다. 그만큼 클래스 내에서 광범위하게 사용되는 중요한 변수들이라 할 수 있습니다. 그리고 메서드영역에 선언되면 지역변수가 됩니다. 메서드 영역은 메서드의 블럭의 시작과 끝... 여기부터 여기까지...의 영역을 말합니다. 변수가 클래스영역에 선언되지 않았다면, 모두 지역변수라고 보시면 되겠습니다. 즉, 클래스변수와 인스턴스변수가 아니라면 모두 지역변수입니다. 그리고 지역변수에는 static을 붙일 수 없습니다. 클래스변수는 클래스가 메모리에 올라갈때 자동적으로 생성됩니다. 그래서... 원하는 때면 언제든지 바로 사용가능합니다. 인스턴스를 생성하지 않고도 사용할 수 있다는 얘기죠. 반면에 인스턴스변수는 인스턴스를 생성해야 만들어지므로 사용하기 전에 반드시 인스턴스를 생성해야합니다. 앞서 나왔던... Time클래스의 인스턴스변수들은 인스턴스를 생성해야 만들어졌던 것을 그림을 통해 다시한번 확인하시기 바랍니다. 마지막으로 지역변수는 메서드가 호출되어 해당하는 변수선언문이 수행될 때 만들어집니다. 앞으로 보다 자세히 알아볼 것이니까요... 지금은 변수의 선언위치에 따른 종류... 즉, 어떤게 지역변수고 어떤게 인스턴스변수인지 구별할 수 있을 정도만 이해하셔도 좋습니다. 변수의 종류 선언위치 생성시기 클래스변수 클래스 영역 클래스가 메모리에 올라갈 때 인스턴스변수 인스턴스 생성시 지역변수 메서드 영역 변수 선언문 수행시 5
6
Java 3.1 선언위치에 따른 변수의 종류 정석 - 각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능
Chapter 6. 객체지향개념 I 3.1 선언위치에 따른 변수의 종류 ▶ 인스턴스변수(instance variable) - 각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능 - 인스턴스 생성 후, ‘참조변수.인스턴스변수명’으로 접근 - 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해자동제거됨 ▶ 클래스변수(class variable) - 같은 클래스의 모든 인스턴스들이 공유하는 변수 - 인스턴스 생성없이 ‘클래스이름.클래스변수명’으로 접근 앞서 살펴본것과 같이 선언위치에 따른 변수의 종류는... 인스턴스변수, 클래스변수, 지역변수 3가지가 있다고 했습니다. 각 변수의 특징에 대해서 자세히 살펴보도록 하겠습니다. 먼저 인스턴스변수... 인스턴스변수는 인스턴스를 생성할 때마다 만들어지는 개별적인 저장공간입니다. 인스턴스마다 서로 다른 값을 가질 수 있음을 의미하는 것이지요. 인스턴스를 생성 한 다음에... 참조변수를 통해서 접근할 수 있다는 것도 이미 이전 강의에서 설명했으므로 잘 이해하고 계시리라 생각합니다. 인스턴스를 참조하고 있는 참조변수가 하나도 없을 때... 가비지 컬렉터에 의해서 자동적으로 제거됩니다. 인스턴스를 가리키는 참조변수가 하나도 없다고 해서 인스턴스가 즉시 메모리에서 제거되는 것이 아니라... 가지비 컬렉터는 일정시간마다 주기적으로, 또는 사용할 수 있는 메모리가 얼마남지 않았을 때... 실행되어 메모리에서 사용되지 않는 인스턴스를 제거함으로써 사용할 수 있는 메모리의 양을 늘린다는 점을 확인해 두시기 바랍니다. 클래스변수는... 인스턴스변수와 달리... 모든 인스턴스들이 공유하는 저장공간입니다. 클래스변수는 처음으로 클래스가 로딩될 때 생성되었다가 프로그램이 종료되기 전까지 유지되는데요. 클래스는... 해당 타입의 변수를 선언한다던가... 하는 경우와 같이 클래스의 정보가 필요할 때 자동적으로 메모리에 로딩됩니다. 그래서... 클래스변수를 사용하려고 할 때... 해당 클래스 정보가 이미 메모리에 올라가 있지 않더라도 바로 메모리에 로딩되어 자동생성됩니다. 클래스변수는 ... 인스턴스를 생성하지 않아도... 언제라도 클래스이름.클래스변수명으로 바로 사용할 수 있습니다. 지역변수는....메서드 내에 선언되고요... 메서드가 호출되어 메서드의 코드가 수행되면서... 해당 변수 선언문이 수행될 때 생성되었다가 메서드가 종료되면 소멸됩니다. 특히 조건문이나 반복문의 블럭... 내에 선언된 변수들은 해당 블럭을 벗어나면 자동적으로 소멸됩니다. - 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸 ▶ 지역변수(local variable) - 메서드 내에 선언되며, 메서드의 종료와 함께 소멸 - 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸 6
7
Java 의 정석 Chapter 6. 객체지향개념 I 3.2 클래스변수와 인스턴스변수 “인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.” class Card { } 예를 들어... 게임 카드를 분석해보면... 무늬, 숫자, 폭, 높이 등의 속성이 있습니다. 이 중에서 무늬와 숫자는 카드마다 가져야하는 고유의 값이지만 카드의 폭과 높이는 모든 카드가 가져야하는 공통적인 속성이기 때문에 무늬, 숫자는 인스턴스변수로 선언하고... 폭, 높이는 static을 붙여서 클래스변수로 선언해야합니다. 모든 카드의 폭과 높이가 달라서는 안되겠죠... 인스턴스변수 속성 무늬 숫자 폭 높이 기능 ... String kind; // 무늬 int number; // 숫자 클래스변수 static int width = 100; // 폭 static int height = 250; // 높이 7
8
Java 3.2 클래스변수와 인스턴스변수 정석 * 플래시 동영상 : MemberVar.exe 또는 MemberVar.swf
의 정석 Chapter 6. 객체지향개념 I 3.2 클래스변수와 인스턴스변수 * 플래시 동영상 : MemberVar.exe 또는 MemberVar.swf (java_jungsuk_src.zip의 flash폴더에 위치) 앞에서 정의한 Card클래스를 이용한 예제를 플래시동영상을 통해서... 단계별로 자세히 설명드리겠습니다. 책에 나오는 플래시동영상들은 자바의 정석’소스파일의 flash폴더에 있습니다. 8
9
CardTest클래스를 실행하면... CardTest클래스가 메서드영역에 로딩되고...
CardTest클래스의 main가 호출되면서 프로그램이 시작됩니다.
10
main메서드의 첫번째 줄에서 Card클래스의 인스턴스를 생성하는데요...
인스턴스가 생성되기 전에... 먼저 Card클래스가 메모리에 로딩됩니다. 이 때 Card클래스의 클래스변수 width와 height가 만들어집니다. 그리고 각각 100과 250으로 초기화됩니다.
11
그 다음에 Card인스턴스가 생성되어... 인스턴스변수 kind와 number가 생성되고
참조변수 c1이 Card인스턴스를 가리키게 됩니다.
12
앞으로 참조변수 c1이 가리키는 인스턴스를 간단히 인스턴스c1이라고 부르겠습니다.
인스턴스c1의 인스턴스 변수 kind와 number에 각각 Heart와 7을 저장합니다. Card인스턴스를 하나 더 만들어서 참조변수 c2가 가리키게 하고... 인스턴스c2의 인스턴스 변수 kind와 number에 Spade와 4를 각각 저장하고요... 그림을 보시면 알겠지만... Card클래스의 인스턴스변수 kind와 number는 인스턴스마다 별도의 저장공간이지만... 클래스변수 width와 height는 모든 인스턴스가 함께 공유합니다.
13
참조변수 c1과 c2를 이용해서 인스턴스변수와 클래스변수를 모두 출력합니다.
14
참조변수 c1을 이용해서 클래스변수 width와 height의 값을 각각 50과 80으로 변경합니다.
인스턴스에는 자신의 클래스정보에 대한 참조를 가지고 있기 때문에 참조변수를 통해서 클래스변수의 값을 바꿀 수 있습니다.
15
여기서...(라인 11,12) 참조변수 c1이 가리키는 인스턴스의 width, height의 값을 바꾼 것처럼 보이지만... 실제로는 참조변수 c2가 가리키는 인스턴스의 witdh, height의 값도 함께 바뀐 것을 알 수 있습니다. 그래서 클래스변수는 참조변수를 통해서 변경하면 인스턴스변수로 착각할 수 있기 때문에... 클래스변수는 반드시 클래스이름.클래스변수이름'으로 접근하셔야합니다. 그래서 c1.width대신 Card.width로 하시는 것이 올바른 코딩방법입니다. 클래스 메서드 역시 마찬가지로 참조변수 대신 클래스이름을 사용해서 호출하는 것이 맞습니다.
16
Java 3.3 메서드(method) 정석 - 작업을 수행하기 위한 명령문의 집합
Chapter 6. 객체지향개념 I 3.3 메서드(method) public static void main(String args[]) { while(true) { switch(displayMenu()) { // 화면에 메뉴를 출력한다. case 1 : inputRecord(); // 데이터를 입력받는다. break; case 2 : deleteRecord(); // 데이터를 삭제한다. case 3 : sortRecord(); // 데이터를 정렬한다. case 4 : System.out.println("프로그램을 종료합니다.`"); System.exit(0); } } // while(true) } // main메서드의 끝 ▶ 메서드란? - 작업을 수행하기 위한 명령문의 집합 - 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다. (입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.) ▶ 메서드의 장점과 작성지침 - 반복적인 코드를 줄이고 코드의 관리가 용이하다. 메서드는 어떤 작업을 수행하기 위한 명령문들을 묶어 놓은 것입니다. 메서드는 함수, function과 같은 의미인데... 객체지향언어에서는 보통 함수라는 용어대신 메서드라는 용어를 씁니다. 메서드는 일반적으로 어떤 값을 입력받아서 작업하고 그 결과를 돌려줍니다. 예를 들어서 덧셈을 하는 메서드는 더할 숫자를 입력받아서... 더한 다음 그 결과를 돌려주겠죠. 그러나 반드시 입력값이 있어야 하는 것은 아니고요. 결과값이 없을 수도 있습니다. 메서드가 수행하는 작업에 따라 다를 수 있습니다. 메서드를 작성하는 방법에 대해서는 다음 페이지에서 자세히 설명하겠습니다. 메서드를 사용하는 가장 큰 이유는 반복적인 코드를 줄이고 코드의 관리가 용이하다는 것입니다. 동일한 작업을 하는 코드를 여러 곳에 반복해서 넣는 것보다는... 이 코드들을 메서드에 넣고 호출하도록 변경하면... 코드도 간결해지고 나중에 코드에 변경사항이 생겨도 한 곳에서 관리가 되기 때문에 변경이 쉽습니다. 그리고 하나의 메서드에 많은 기능을 넣기 보다는... 하나의 메서드가 하나의 작업을 수행하도록 작성하는 것이 재사용하기에 좋습니다. 여러 번 반복해서 사용되지 않는 코드일지라도... 주요 작업단위로 묶어서 메서드로 만들어 놓으면 프로그램의 전체적인 흐름이 간결하게 정리됩니다. 이 코드는 성적관리 프로그램의 main메서드인데요... 메서드를 이용해서 프로그램의 전체 흐름이 쉽게 눈에 들어오게 했습니다. 프로그램이 클수록... 설계할 때 이렇게 큰 흐름만 잡아놓고... 메서드를 하나하나 완성해 나가는게 좋습니다. 이러한 내용들이 메서드를 작성할 때 꼭 지켜야 하는 원칙은 아닙니다. 참고만 하시고요... 여러분들이 프로그래밍을 하다보면... 어떻게 하는 것이 더 좋은지 스스로 느끼게 될 겁니다. 모든 코드는 누가봐도 알아보기 쉽게... 변경하기 쉽게... 일관되게 작성하는 것이 좋습니다. 그리고 코드의 중복을 최소화 하고 재사용성을 높일 수 있도록 노력하시기 바랍니다. - 반복적으로 수행되는 여러 문장을 메서드로 작성한다. - 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다. - 관련된 여러 문장을 메서드로 작성한다. 16
17
Java 3.3 메서드(method) 정석 의 Chapter 6. 객체지향개념 I
3.3 메서드(method) ▶ 메서드를 정의하는 방법 – 클래스 영역에만 정의할 수 있음 메서드를 정의하는 방법인데요. 메서드는 클래스 영역에만 정의할 수 있고요. 메서드 내에 메서드를 정의할 수 없습니다. 메서드는 크게 선언부와 구현부 두 부분으로 나뉘는데요. 선언부는 메서드의 이름과 리턴타입 매개변수를 정의하는 곳이고요. 구현부는 메서드가 호출되었을 때 실제로 수행되는 코드를 적는 곳입니다. 이 괄호가 블럭의 시작이고 이 괄호가 블럭의 끝입니다. 이 사이에 코드를 넣으셔야 합니다. 선언부의 괄호에는 메서드가 수행되는데 필요한 입력값을 받아올 변수를 선언합니다. 입력값이 없는 경우 빈괄호만 적으시면 되고요. 이 것은 두 개의 값을 받아서 더한 다음 그 결과를 반환하는 add메서드를 정의한 것입니다. add메서드를 호출할 때, 두 개의 값 a와 b를 입력받아서 더 한 결과를 변수 result에 담아서 반환합니다. return문은 메서드의 수행결과를 호출한 곳으로 반환합니다. 잠시 후에 자세히 설명할 것이고요. 이 메서드에 사용된 변수 a, b, result는 선언된 곳이 모두 메서드 내에서 선언되었으므로 모두 지역변수이고 메서드가 종료되면 자동적으로 사라집니다. 메서드 이름앞에 int는 반환하는 값의 타입을 적어주는 것입니다. 만일 반환값이 없을 때는 아래의 power메서드 처럼 void라고 적어주면 됩니다. void는 비어있다’는 의미로 반환값이 없음을 뜻합니다. 앞서 나왔던 Tv클래스의 power메서드를 옮겨온 것인데요. 이 메서드는 입력값도 없고 반환값도 없습니다. 메서드 내에 사용된 변수 power는 Tv클래스의 인스턴스 변수입니다. 17
18
Java 3.4 return문 정석 - 메서드의 블럭{}의 끝에 도달했을 때
Chapter 6. 객체지향개념 I 3.4 return문 ▶ 메서드가 정상적으로 종료되는 경우 - 메서드의 블럭{}의 끝에 도달했을 때 - 메서드의 블럭{}을 수행 도중 return문을 만났을 때 ▶ return문 - 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다. 메서드가 정상적으로 종료되는 경우는 두가지 경우가 있습니다. 메서드의 문장들을 수행하고 더이상 수행할 코드가 없을 때... 그리고 수행중에 return문을 만났을 때입니다. return문은 메서드 내에서만 사용할 수 있는 문장으로... 현재 실행중인 메서드를 종료하고 호출한 곳으로 되돌아갑니다. 반환값이 없는 메서드는 그냥 return문만 써주면되고, 반환값이 있을 때는 return문 뒤에 반환값을 같이 써주어야 합니다. 이 때 반환값은 메서드에 정의된 반환 타입하고 일치하거나 자동형변환이 가능한 것이어야 합니다. 그래서 add메서드의 경우 리턴타입이 int니까... 반환값의 타입이 int이거나 int로 자동형변환이 가능한 byte, short, char이어야 합니다. 18
19
Java 3.4 return문 - 주의사항 정석 의 Chapter 6. 객체지향개념 I
3.4 return문 - 주의사항 ▶ 반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다. int max(int a, int b) { if(a > b) return a; } int max(int a, int b) { if(a > b) return a; else return b; } ▶ return문의 개수는 최소화하는 것이 좋다. int max(int a, int b) { int result = 0; if(a > b) result = a; else result = b; return result; } return문을 사용할 때 주의해야할 점은... 반환값이 있는 메서드는 반드시 모든 경우에 결과값을 반환하도록 해야한다는 것입니다. 이처럼 if문을 사용하는 경우에 실수하기 쉬운데요. 왼쪽의 메서드에서는 조건식의 결과가 true인 경우에는 바르게 결과값을 반환하지만... false인 경우에는 결과값을 반환하지 않기 때문에 컴파일시에 에러가 발생합니다. 오른쪽과 같이 if문의 조건식의 결과에 상관없이 결과값을 반환하도록 변경해야합니다. 그리고 하나의 메서드 내에서 return문의 개수는 최소화 하는 것이 좋습니다. 왼쪽 코드와 같이 return문을 2개 쓰는 것 보다는 실행결과를 하나의 변수에 저장해놨다가 마지막에 return문을 이용해서 결과값을 반환하도록 하는 것이 더 좋은 코드입니다. int max(int a, int b) { if(a > b) return a; else return b; } 19
20
Java 3.5 메서드의 호출 정석 의 Chapter 6. 객체지향개념 I
3.5 메서드의 호출 ▶ 메서드의 호출방법 참조변수.메서드 이름(); // 메서드에 선언된 매개변수가 없는 경우 참조변수.메서드 이름(값1, 값2, ... ); // 메서드에 선언된 매개변수가 있는 경우 class MyMath { long add(long a, long b) { long result = a + b; return result; // return a + b; } ... 지금까지 메서드를 정의하고 작성하는 방법에 대해서 알아봤는데요. 이번엔 만들어 놓은 메서드를 호출하는 방법에 대해서 알아보겠습니다. 메서드를 호출하려면... 참조변수.메서드이름을 적고 괄호 안에 입력값을 넣어주기만 하면 됩니다. 그리고 입력값은 메서드의 선언부에 선언된 변수의 타입과 일치하거나 자동형변환이 가능한 값이어야 합니다. 예를 들어서 왼쪽과 같이 add메서드가 정의되어 있을 때 이 메서드를 호출하기 위해서는... 먼저 add메서드가 정의되어 있는 MyMath클래스의 인스턴스를 생성한 다음에... 참조변수를 통해 add메서드를 호출하면 됩니다. add메서드는 입력값으로 long타입의 변수 두 개... a, b를 선언했으므로... 호출할 때는 두 개의 long타입의 값을 제공해야합니다. 호출할 때 제공된 값은 메서드의 매개변수 a, b에 복사되고... 이 값들을 이용해서 작업을 합니다. 작업이 끝나면 결과값인 result가 메서드를 호출한 곳으로 반환되어... 변수 long에 저장됩니다. 이처럼 결과값이 있는 메서드를 호출하는 경우에는... 메서드를 호출한 결과를 저장할 변수가 필요합니다. 그냥 메서드만 호출해서는 아무런 결과도 얻을 수 없습니다. 결과값을 저장할 변수 value 역시 add메서드의 리턴타입인 long으로 선언했다는 점 확인하시기 바랍니다. 여기서 add메서드를 호출할 때 입력값으로 1L과 2L을 지정했으니까... 1L과 2L이 각각 변수 a와 b에 저장되고요. 변수 result에는 3L이 저장됩니다. 그 다음에 return문에 의해서 result에 저장된 값 3L이 호출한 곳으로 반환되어 변수 value에 add메서드의 호출결과인 3L이 저장됩니다. 만일 대입연산자를 이용해서 변수 value에 저장하도록 하지 않는다고 해도 에러가 발생하지는 않습니다. 그냥 메서드 호출만 하고 아무런 결과도 얻지 못할 뿐입니다. 앞서 설명드린것과 같이.... 클래스 메서드의 경우에... 이처럼 참조변수를 이용해서도 호출이 가능하지만... 참조변수 대신 클래스이름 사용해서 호출하는 것이 좋습니다. 20
21
Java 3.6 JVM의 메모리 구조 정석 - 클래스 정보와 클래스변수가 저장되는 곳
Chapter 6. 객체지향개념 I 3.6 JVM의 메모리 구조 ▶ 메서드영역(Method Area) - 클래스 정보와 클래스변수가 저장되는 곳 ▶ 호출스택(Call Stack) - 메서드의 작업공간. 메서드가 호출되면 메서드 수행에 필요한 메모리공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환한다. 이번엔 JVM의 메모리구조에 대해서 간단히 설명하겠습니다. 실제로는 이 그림보다 좀더 복잡한 형태로 되어 있는데요... 여러분들이 자바를 이해하는데 필요한 최소한의 내용으로 구성하기 위해 단순화 하였습니다. 이해를 돕기위해서 메모리구조에 대해서 간단히 배우는 것이지... 메모리구조를 배우기 위해서 설명하는 것이 아니라는 점 다시 한번 명심하시기 바랍니다. 여기서 메모리구조에 대해 궁금한 것들이 더 있더라도 일단 진도에 필요한 만큼만... 이책에서 설명하는 만큼만 알고 넘어가시기 바랍니다. 메서드영역은 클래스정보가 저장되는 곳입니다. 프로그램이 실행되는 과정에서 필요한 클래스의 클래스파일을 찾아서 이곳에 읽어옵니다. 이 때, 메모리에 로딩될때... 클래스에 정의된 클래스변수가 자동생성됩니다. 호출스택은 메서드의 작업공간입니다. 메서드가 호출되면... 이 곳에 작업에 필요한 메모리를 얻어서 수행하게 됩니다. 메서드가 종료되면.... 사용하던 메모리를 자동적으로 반환합니다. 메서드에 선언된 지역변수들은 이 곳에 만들어집니다. 힙은... 인스턴스가 생성되는 공간입니다. new연산자에 의해서 상성되는 배열과 객체는 모두 여기에 생성됩니다. 그래서 인스턴스변수는 여기에 생성되겠죠. JVM은 이렇게 크게 3개의 영역으로 나누어져 있다는 것과 변수의 종류에 따라 생성되는 영역이 다르다는 것 정도만 확인하시면 됩니다. 여기서 제일 중요한 것은 호출스택인데요. 호출스택에 대해서 잘 모르면 나중에 배울 예외처리를 완전히 이해하기 어렵습니다. 그래서 호출스택에 대해서만 좀 더 자세히 알아보도록 하겠습니다. ▶ 힙(Heap) - 인스턴스가 생성되는 공간. new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성된다. 21
22
Java 3.6 JVM의 메모리 구조 - 호출스택 정석 - 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.
Chapter 6. 객체지향개념 I 3.6 JVM의 메모리 구조 - 호출스택 ▶ 호출스택의 특징 - 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다. - 메서드가 수행을 마치면 사용했던 메모리를 반환한다. - 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드다. - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드다. 메서드가 호출되면... 메서드영역의 클래스정보를 읽어서 메서드의 내용을 분석해서 이 메서드가 작업하는데 필요한 메모리의 양을 계산하여 그만큼의 공간을 스택에 할당받습니다. 이 메모리공간은 메서드가 작업을 마치고 나면 자동적으로 스택에서 제거됩니다 예를 들어 main메서드가 호출되면... 처음엔 호출스택이 비어있다가... main메서드가 포함된 클래스의 정보를 메서드 영역에서 읽어서 main메서드가 수행되는데 필요한 메모리를 계산해서 그 만큼의 공간이 스택에 마련됩니다. 호출스택은... 스택이라는 자료구조의 형태로 되어 있기 때문에 붙여진 이름입니다. 스택이라는 자료구조의 특징은... 데이터를 꺼낼때 제일 마지막에 넣은 데이터를 제일 먼저 꺼내게 된다는 것입니다. 택시기사님들이 가지고 다니시는 동전통과 같은 구조인데요... 넣는 순서대로 동전이 차곡차곡 쌓이다가 꺼낼때는 맨마지막에 넣은 동전이 제일 먼저 나오지 않습니까... 호출스택 역시 제일 먼저 호출된 메서드가 제일 바닥에 깔리고 제일 나중에 호출된 메서드가 제일 위에 올라옵니다. 처음에는 스택이 비어있다가... 자바프로그램은 main메서드를 호출함으로써 시작되니까... main 메서드가 스택에 저장되고 main메서드가 firstMethod라는 메서드를 호출하면 맨 오른쪽과 같은 그림이 됩니다. 이때 main메서드는 대기상태가 되고 firstMethod메서드가 실행됩니다. firstMethod가 수행을 마치고 나면 스택에서 제거되고 firstMethod를 호출한 main메서드로 다시 돌아가서 firstMethod를 호출한 다음 문장부터 수행을 계속 합니다. 여기서 알수 있듯이 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드입니다. 나머지 메서드는 모두 대기상태이고요. 호출스택에서 서로 위아래로 붙어 있는 메서드는 서로 호출하고 호출된 메서드입니다. 만일 호출스택이 맨 오른쪽 그림과 같이 되어 있다면... 현재 실행중인 메서드는 firstMethod이고 firstMethod를 호출한 것은 main메서드입니다. 22
23
Java 3.6 JVM의 메모리 구조 - 호출스택 정석 의 Chapter 6. 객체지향개념 I
3.6 JVM의 메모리 구조 - 호출스택 class CallStackTest { public static void main(String[] args) { firstMethod(); } static void firstMethod() { secondMethod(); static void secondMethod() { System.out.println("secondMethod()"); 예제를 통해서... 호출스택의 변화를 자세히 살펴보도록 하겠습니다. CallStackTest라는 예제를 실행시키면... 처음에는 1번과 같이 호출스택이 비어있다가... CallStackTest클래스의 main메서드가 java.exe에 의해서 자동적으로 호출되면서... 프로그램이 시작됩니다. 그림에서 회색으로 칠해진 메서드가 현재 실행중인 메서드입니다. 항상 호출스택의 맨위에 있는 메서드 하나만 실행중이라는 것을 확인하세요. 그리고 나머지 메서드들은 대기상태에 있게 됩니다. main메서드가 firstMethod를 호출합니다. 그러면 호출스택에는 firstMethod가 수행될 메모리공간이 마련되고 firstMethod가 수행되기 시작합니다. main메서드는 아직 작업이 완료되지 않았으므로 호출스택에 대기상태로 남아있게 됩니다. firstMethod에서는 또 secondMethod를 호출합니다. secondMethod는 println메서드를 호출하고... println메서드는 secondMethod()라는 글자를 화면에 출력합니다. println이 글자를 출력하고 종료되면... 호출스택에서 제거되고... println을 호출한 secondMethod()로 돌아갑니다. secondMethod에 더이상 수행할 문장이 없으므로 종료되고 자신을 호출한 firstMethod로 돌아갑니다. firstMethod와 main메서드도 더이상 수행할 문장이 없으므로... 차례로 호출스택에서 제거되고... 호출스택은 완전히 비워지고... 프로그램은 종료됩니다. 23
24
Java 3.7 기본형 매개변수와 참조형 매개변수 정석
의 정석 Chapter 6. 객체지향개념 I 3.7 기본형 매개변수와 참조형 매개변수 ▶ 기본형 매개변수 – 변수의 값을 읽기만 할 수 있다.(read only) ▶ 참조형 매개변수 – 변수의 값을 읽고 변경할 수 있다.(read & write) * 플래시 동영상(java_jungsuk_src.zip의 flash폴더에 위치) - 기본형 매개변수 예제 : PrimitiveParam.exe - 참조형 매개변수 예제 : ReferenceParam.exe 메서드를 호출할 때 입력하는 값은 메서드에 정의된 매개변수로 복사됩니다. 매개변수의 타입이 기본형이라면 넘겨받은 값을 읽을 수는 있지만 그 값을 변경할 수는 없습니다. 그러나 매개변수의 타입이 참조형이라면... 값을 읽는 것 뿐 만아니라 변경도 할 수 있습니다. 기본형타입의 변수는 단순히 저장된 값을 복사하는 것이기 때문에 그 값이 어디서 온 것인지 알 수 없지만... 참조형타입의 변수는 값이 저장되어 있는 곳의 주소값을 복사하는 것이기 때문에... 값이 저장된 위치를 알 수 있기 때문입니다. 값이 어디에 저장되어 있는지 알게 되니까... 값을 읽어올 수도 변경할 수도 있는 것입니다. 동생한테 몇시냐고 물어보면... 시간을 알 수는 있지만... 시계가 어디에 있는지 모르기 때문에 시간을 변경할 수는 없습니다. 그러나 동생한테 시계가 어디에 있는지 알아내면... 시계의 위치를 알 수 있기 때문에 시간을 알 수도 있고 변경할 수도 있는 것입니다. 메서드의 매개변수가 기본형인 경우와 참조형인 경우를 두 개의 예제로 만들었습니다. 그리고 그 예제의 실행과정을 플래시 동영상으로도 만들어 놓았습니다. 이 두 예제를 잘 비교해서 그 차이를 잘 이해하시기 바랍니다. 먼저 기본형 매개변수 예제인 PrimitivieParam.exe를 가지고 설명하겠습니다. 24
40
Java 3.8 재귀호출(recursive call) 정석 - 메서드 내에서 자기자신을 반복적으로 호출하는 것
의 정석 Chapter 6. 객체지향개념 I 3.8 재귀호출(recursive call) ▶ 재귀호출이란? - 메서드 내에서 자기자신을 반복적으로 호출하는 것 - 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁨 - 이해하기 쉽고 간결한 코드를 작성할 수 있다 ▶ 재귀호출의 예(例) - 팩토리얼, 제곱, 트리운행, 폴더목록표시 등 long factorial(int n) { long result = 0; if(n==1) { result = 1; } else { result = n * factorial(n-1); } return result; 재귀호출은 메서드 내에서 메서드 자기자신을 다시 호출하는 것입니다. 이렇게 하면 메서드의 코드가 반복적으로 계속 수행되니까 반복문과 같은 효과를 얻습니다. 재귀호출 대신 반복문으로 처리할 수도 있고요... 재귀호출은 반복해서 메서드를 호출하기 때문에... 하나의 메서드에서 반복문으로 처리하는 것보다 효율이 떨어집니다. 반복문의 루프를 도는 것보다 메서드를 호출하는데 드는 비용이 더 크기 때문이죠. 메서드를 호출하려면 호출스택에 메모리도 할당해야하고... 여러가지 작업을 필요합니다. 그럼에도 불구하고 반복문 대신 재귀호출을 사용하는 것은... 코드가 간결하고 논리적으로 이해하기 쉬워지기 때문입니다. 예전에는 하드웨어의 성능이 좋지 않아서 속도와 효율이 프로그래밍의 가장 중요한 요소였으나 이제는 하드웨어의 성능이 충분히 좋아져서... 속도와 효율보다는 코드의 관리가 더 중요한 요소가 되었습니다. 그래서 프로그램의 작성을 완료한 다음에... 속도가 개선되어야 하는 부분을 골라서 따로 성능향상을 시키는 방식으로 처리합니다. 재귀호출의 사용예는 팩토리얼이나 제곱, 트리와 같은 자료구조, 폴더의 파일목록을 표시하는데 사용됩니다. 팩토리얼은 한 정수를 1이 될 때까지 1씩 감소시켜가면서 곱해나가는 것인데요. 5팩토리얼은 5 * 4 * 3 * 2 * 1이 됩니다. 함수로 표현하면... f(n)은 n * f(n-1) 이 됩니다. 이 함수를 메서드로 표현하면 오른쪽과 같은 코드가 됩니다. 하나의 정수를 매개변수로 입력받아서 n이 1일 때는 1을 반환하고, 1이 아닐 때는 메서드 자기자신을 다시 호출합니다. *팩토리얼(factorial) 5! = 5 * 4 * 3 * 2 * 1 f(n) = n * f(n-1) 단, f(1) = 1 40
41
Java 3.8 재귀호출(recursive call) 정석
의 정석 Chapter 6. 객체지향개념 I 3.8 재귀호출(recursive call) * 플래시 동영상 : RecursiveCall.exe (java_jungsuk_src.zip의 flash폴더에 위치) 재귀호출의 실행과정을 플래시 동영상으로 만들어봤습니다. 재귀호출이 처음에는 이해하기 조금 어렵기 때문에... 응용이 잘안된다고 부담갖지마세요. 지금은 팩토리얼이 어떻게 재귀호출로 구현되었는지만 정확이 이해하시고 나중에 다른 재귀호출의 예가 나오면... 팩토리얼과 비교하시면 이해가 쉬워질 겁니다. 41
42
42
43
43 43
44
44 44
45
45 45
46
46 46
47
47 47
48
48 48
49
49 49
50
50 50
51
51 51
52
3.9 클래스메서드(static메서드)와 인스턴스메서드
Java 의 정석 Chapter 6. 객체지향개념 I 3.9 클래스메서드(static메서드)와 인스턴스메서드 ▶ 인스턴스메서드 - 인스턴스 생성 후, ‘참조변수.메서드이름()’으로 호출 - 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드 - 메서드 내에서 인스턴스변수 사용가능 ▶ 클래스메서드(static메서드) - 객체생성없이 ‘클래스이름.메서드이름()’으로 호출 변수에 클래스변수와 인스턴스변수가 있는 것처럼... 메서드에도 인스턴스메서드와 클래스메서드가 있습니다. 클래스 메서드는 메서드 앞에 static이 붙은 것인데요... 대표적인 것이 main메서드입니다. 클래스변수를 객체생성없이 바로 사용할 수 있는 것처럼... 클래스 메서드도 인스턴스생성없이.... 클래스이름. 메서드이름으로 호출할 수 있습니다. 반대로 인스턴스메서드는 인스턴스변수처럼... 인스턴스를 생성해야만 호출할 수 있고요. 앞서 클래스의 정의에서 배운 것과 같이... 메서드는 데이터, 즉 멤버변수를 가지고 작업을 하는 경우가 많기 습니다. 그래서 인스턴스메서드는 인스턴스변수를 가지고 작업하는 메서드이고 클래스메서드는 클래스변수를 가지고 작업하는 메서드라고 이해하시면 쉽습니다. 그러나 실제로 대부분의 클래스 메서드는 클래스변수를 가지고 작업하는 경우보다 인스턴스변수를 사용하지 않는 경우가 더 많습니다. 결론적으로 메서드의 작업에 인스턴스변수를 사용하면 인스턴스메서드 사용하지 않으면 클래스메서드라고 알아두시면 되겠습니다. 여러분들이 메서드를 정의할 때 static을 붙여야 할지를 결정할 때 메서드 내에서 인스턴스변수를 사용하는지 확인해서... 인스턴스변수를 사용하지 않을 때만... static을 붙이시면 되겠습니다. 인스턴스메서드를 호출하는 것도 결국 인스턴스변수를 간접적으로 사용하는 것이기 때문에 메서드 내에서 인스턴스메서드를 호출하는 것도 인스턴스 변수를 사용하는 것이라고 볼 수 있습니다. 인스턴스변수는 인스턴스를 생성해야만 존재하기 때문에... 언제라도 호출될 수 있는 static메서드가... 호출되었을 때 인스턴스 변수가 존재한다는 보장이 없어서... static메서드가 인스턴스변수를 사용할 수 없는 것입니다. 많은 분들에게 static메서드가 뭐냐고 물으면, 인스턴스생성을 하지않고 직접 호출할수 있는 메서드이다. 라고 대답하시는데 이것은 완전한 답이 아닙니다. 어떤 분은 인스턴스메서드는 인스턴스마다 개별적으로 존재하는 것이고... 클래스메서드는 같은 클래스의 인스턴스들이 공통으로 사용하는 것이다...라고 하시는데 이것은 맞지 않는 얘깁니다... 메서드의 내용은 인스턴스마다 다르지 않습니다. 다만 입력받는 값이나 사용하는 인스턴스변수에 의해서 결과가 다를 뿐입니다. 다시 정리해서 말씀드리면... 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 것이 인스턴스메서드이고, 그렇지 않은 것은... 클래스 메서드입니다. - 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드 - 메서드 내에서 인스턴스변수 사용불가 - 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다. 52 52
53
3.9 클래스메서드(static메서드)와 인스턴스메서드
Java 의 정석 Chapter 6. 객체지향개념 I 3.9 클래스메서드(static메서드)와 인스턴스메서드 class MyMath2 { long a, b; long add() { // 인스턴스메서드 return a + b; } static long add(long a, long b) { // 클래스메서드(static메서드) class MyMathTest2 { public static void main(String args[]) { System.out.println(MyMath2.add(200L,100L); // 클래스메서드 호출 MyMath2 mm = new MyMath2(); // 인스턴스 생성 mm.a = 200L; mm.b = 100L; System.out.println(mm.add()); // 인스턴스메서드 호출 } MyMath2클래스에 두개의 add메서드가 있는데요. 하나는 인스턴스메서드이고 하나는 클래스메서드입니다. 인스턴스메서드는 인스턴스변수 a와 b를 더하는 작업을 하기 때문에... 별도의 입력값이 필요하지 않습니다. 그러나 클래스메서드는 인스턴스변수를 사용하는 대신 입력받은 두개의 값을 더해서 반환하는 일을합니다. 인스턴스 메서드와는 달리 클래스메서드에서는 인스턴스변수 a, b를 사용하지 않았기에 static을 붙일 수 있었습니다. 이제 MyMathTest2클래스에서 이 메서드들을 호출합니다. 클래스메서드는 이처럼 인스턴스를 생성하지 않고도 바로 호출이 가능합니다. 화면에 100과 200의 합인 300이 출력되겠죠... 인스턴스메서드는 먼저 인스턴스를 생성하고... 인스턴스변수 a에는 200을... b에는 100을... 지정해주고... 인스턴스메서드를 호출합니다. 인스턴스 메서드는 인스턴스변수 a와 b의 합을 결과로 돌려주므로... add메서드를 호출한 결과는 300이 되고 화면에는 300이 출력됩니다. 이 예제를 통해서 클래스메서드와 인스턴스메서드의 사용방법과 차이를 잘이해하셔야 합니다. 53
54
Java 3.10 멤버간의 참조와 호출(1/2) – 메서드의 호출 정석
Chapter 6. 객체지향개념 I 3.10 멤버간의 참조와 호출(1/2) – 메서드의 호출 “같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.” 전에 클래스의 정의에서 배운 것 처럼... 하나의 클래스에 정의된 멤버들은 서로 관련이 깊기 때문에...클래스 내에서는 이름만으로도 접근, 호출이 가능합니다. 그러나 static멤버들은 인스턴스멤버를 이름만으로 접근, 호출이 불가능합니다. 이처럼... 클래스에 instanceMethod라는 인스턴스메서드와 staticMethod라는 클래스메서드가 있을 때... 또다른 인스턴스메서드인 instanceMethod2는 메서드의 이름만으로 클래스메서드와 인스턴스메서드를 모두 호출하는 것이 가능합니다. 그러나 또다른 클래스메서드인 staticMethod2는 클래스메서드인 staticMethod는 호출가능하지만... 인스턴스메서드인 instanceMethod는 호출할 수 없습니다. 그 이유는 앞서 얘기했던것처럼... 클래스멤버들은 인스턴스를 생성하지 않고도 사용할 수 있기 때문에... 인스턴스를 생성해야만 사용할 수 있는 인스턴스멤버들을 사용하지 못하게 되어 있기 때문입니다. 결론은... 같은 클래스 내의 멤버들끼리는 서로 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다...는 것입니다. 54
55
Java 3.10 멤버간의 참조와 호출(2/2) – 변수의 접근 정석
Chapter 6. 객체지향개념 I 3.10 멤버간의 참조와 호출(2/2) – 변수의 접근 “같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.” 좀전에는 메서드들 간의 호출에 대해서 알아봤고요. 이번에는 메서드에서 멤버변수에 접근하는 것에 대해서 알아보겠습니다. 이처럼... 인스턴스변수 iv와 클래스변수 cv가 있을 때... 인스턴스메서드 instanceMethod()에서는 iv와 cv를 모두 사용할 수 있지만... 클래스메서드인 staticMethod()는 인스턴스변수인 iv를 사용할 수 없습니다. 55
56
Java 의 정석 Chapter 6. 객체지향개념 I 4. 메서드 오버로딩
57
4.1 메서드 오버로딩(method overloading)이란?
Java 의 정석 Chapter 6. 객체지향개념 I 4.1 메서드 오버로딩(method overloading)이란? “하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩, 간단히 오버로딩이라고 한다.” * overload - vt. 과적하다. 부담을 많이 지우다. 4.2 오버로딩의 조건 - 메서드의 이름이 같아야 한다. - 매개변수의 개수 또는 타입이 달라야 한다. 메서드 오버로딩은... 하나의 클래스에 같은 이름의 메서드를 여러개 정의하는 것을 말합니다. 오버로드의 사전적 정의는 과적하다... 부담을 많이 지우다...라는 것이고요. 보통은 하나의 메서드 이름에 하나의 메서드만을 정의하는데... 하나의 이름으로 여러 메서드를 정의하기 때문에... 과적하다...라는 이름이 붙었다고 이해하시면 되겠습니다. 같은 클래스 내에서 메서드나 멤버변수들은 서로 구분되어야하기 때문에 서로 다른 이름을 가져야하는데요... 메서드는 이름이 같아도 되도록 허용하였습니다. 이 것이 바로 오버로딩이죠... 그런데... 오버로딩이 성립하기 위한 몇가지 조건이 있습니다. 오버로딩 되는 메서드들은 서로 이름이 같아야하고요. 매개변수의 개수 또는 타입이 달라야합니다. 메서드의 이름이 같으니까 매개변수를 가지고 어떤 메서드를 호출한 것인지 판단합니다. 메서드의 이름과 매개변수가 같은데 리턴타입만 다른 경우는 오버로딩이 성립하지 않는다는거... 주의하시기 바랍니다. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다. (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.) 57
58
Java 4.3 오버로딩의 예(1/3) 정석 - 다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계
Chapter 6. 객체지향개념 I 4.3 오버로딩의 예(1/3) ▶ System.out.println메서드 - 다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계 오버로딩의 대표적인 예가 바로 println메서드인데요. 지금까지 아무거나 다 println에 집어넣기만 하면 화면에 출력될 수 있었던 이유가 바로... 이렇게 많은 수의 오버로딩된 메서드를 제공하기 때문인 것입니다. println을 호출할 때 어떤 값을 넘겨주는가에 따라서... 이 10개의 메서드 중에서 하나가 호출되는 것입니다. 우리는 뭘 출력하던지... 그냥 메서드이름만 알고 있으면 화면에 출력할 수 있었습니다. 만일 자바가 오버로딩을 지원하지 않는다면... 이 10개의 메서드는 모두 다른이름을 가져야만 했을 것이고... 우리는 그 이름을 다 외워야했을 겁니다. 외우기도 힘들거니와 실수할 확률도 높아지겠죠... 다행히도 자바에서는 오버로딩을 지원함으로써 우리의 수고를 많이 덜어주게 되었습니다. 58
59
Java 4.3 오버로딩의 예(1/2) 정석 의 Chapter 6. 객체지향개념 I
4.3 오버로딩의 예(1/2) ▶ 매개변수의 이름이 다른 것은 오버로딩이 아니다. ▶ 리턴타입은 오버로딩의 성립조건이 아니다. 몇가지 예를 통해서 오버로딩에 대해서 자세히 알아보겠습니다. 보기1을 보면 add라는 이름을 가진 2개의 메서드가 있는데요... 매개변수가 다른 것 같지만... 타입은 같고 단지 변수의 이름만 다릅니다. 이런 경우 이 두 메서드는 오버로딩이 아니라 완전히 같은 메서드입니다. 수학에서 f(x) = x + 1과 f(a) = a + 1이 동일한 함수인 것과 같이 말입니다. 컴파일 하면... 이미 같은 이름의 메서드가 정의되어 있다가 에러가 발생합니다. 보기2는 두 메서드가 리턴타입만 다른 경우인데요... 앞서 말씀드린것과 같이... 리턴타입은 메서드를 구별하는데 영향을 주지 못하므로 오버로딩이아니라 보기1과 같이... 컴파일 할 때... 이미 같은 이름의 메서드가 정의되어 있다는 에러가 발생합니다. 59
60
Java 4.3 오버로딩의 예(1/3) 정석 의 Chapter 6. 객체지향개념 I
4.3 오버로딩의 예(1/3) ▶ 매개변수의 타입이 다르므로 오버로딩이 성립한다. ▶ 오버로딩의 올바른 예 – 매개변수는 다르지만 같은 의미의 기능수행 보기 3은 올바르게 오버로딩 된 예입니다. 이처럼... 매개변수의 타입이 같아도 순서가 다르면 오버로딩 된.... 서로 다른 메서드로 인정합니다. 다만 주의해야할 점은.... 호출할 때 어떤 메서드가 호출될 것인지 정확히 구분해줘야한다는 것입니다. 예를 들어서 add(3,5)와 같이 호출하면 이 두 메서드 중에서 어떤 메서드가 호출될까요? 어느것도 호출되지 못하고... 컴파일 에러가 발생합니다. 어떤 메서드를 호출한 것인지를 컴퓨터가 구별할 수 없기 때문이죠. 그래서 호출할 때 add(3, 5L)... 이렇게 입력값을 주어야... 어떤 메서드를 호출한 것인지 명확해집니다. 보기4에 세 개의 올바르게 오버로딩된 메서드이 있습니다. 첫번째와 두번째 add메서드는 두 개의 값을 매개변수로 받아서 두 값을 더한 결과를 반환하고요. 세번째 add메서드는 배열을 매개변수로 넘겨받아서 배열에 담긴 모든 정수를 더해서 반환합니다. 그러면 언제 오버로딩을 구현해야하냐면... 실제로 작업내용은 달라도 의미적으로 같은 일을 수행하는 경우에 오버로딩을 합니다. 보기4에 나오는 세 개의 메서드는... 실제로 수행되는 코드는 다르지만... 매개변수로 넘겨받은 값을 더해서 결과로 반환하는... 같은 의미의 작업을 수행합니다. 메서드의 이름이라는 것이 보통 ‘동사’이기 때문에... 여기서도 add가 더한다는 의미의 동사죠? 꼭 동사이어야하는 것은 아니지만... 무엇을 더할 것인지는 서로 다르지만... 더한다는 행위자체는 같기 때문에... 이 메서드들을 오버로딩해서 구현하는 것입니다. 그리고 메서드를 사용하는 사람의 입장에서는 실제 코드의 내용은 몰라도... 이 메서드들은 이름이 같으니까... 매개변수는 달라도 같은 의미의 일을 하겠구나...라고 추측할 수 있게 됩니다. 60
61
감사합니다. http://www.javachobo.com Java 정석
의 정석 Chapter 6. 객체지향개념 I 감사합니다. 더 많은 동영상강좌를 아래의 사이트에서 구하실 수 있습니다. 이것으로 제 6장 객체지향개념1-2에 대한 강의를 모두 마치겠습니다. 감사합니다. 이 동영상강좌는 비상업적 용도일 경우에 한해서 저자의 허가없이 배포하실 수 있습니다. 그러나 일부 무단전제 및 변경은 금지합니다. 관련문의 : 남궁성
Similar presentations