메서드란 단어 꽤나 생소한 단어이다.

 

최근에는 배우의 메서드 연기라는 말도 심심찮게 들린다.

 

영어사전 dictionary.com 에 나오는 method의 첫번째 정의는 다음과 같다.

 

1. a procedure, technique, or way of doing something, especially in accordance with a definite plan:

 

절차, 기술, 일을 하는 방식, 특히 확정된 계획에 따라서 하는

 

메서드 이전에 함수(function)가 있다. 함수를 procedure 혹은 rootine 이라고 부른다.

 

* 함수 (function)

 

수학의 함수를 기억하는가?

 

f(x) = y

f(x) = 2x + 1

y = 2x + 1

 

x의 값을 입력하면 y가 결정된다.

 

함수

컴퓨터 프로그래밍에서의 함수도 비슷하다. 위의 수학식을 C언어의 함수로 만들면

 

int function1 (int x){

return (2 * x) + 1;

}

 

함수 function1은 x값을 받아서(input) 2 * x + 1 을 계산한 값을 돌려준다(output)

 

입력 (Input) 이 있으면 출력(Output)이 나오는 것이다. 이것을 하나의 procedure 로 정의하면 프로그램의 어디에서나 함수를 부를 수(호출) 있는 것이다. 함수는 한번 만들어 놓으면 계속 사용할 수가 있으니까 편리하다. 저 함수를 가지고 1부터 100까지의 홀수를 출력하라고 하면

 

for(int i = 0; i < 50; i++){

System.out.println( function(i) );

}

 

이렇게 할 수 있다. 코드가 간결해지는 장점이 있다. 만약 짝수로 변경하고 싶으면 function1 의 식을 약간만 수정하면 된다. 함수의 내용이 복잡할 수록 재사용 횟수가 많을 수록 함수로 만들면 유리하다. 프로그램을 기능에 따라 모듈로 나누는 것이다.

 

절차적 언어에서는 함수를,

 

객체지향 언어에서는 메서드를 사용한다.

 

메서드와 함수는 매개변수(int a , int b 같이 함수에 전달 받는 수)를 받아 코드 블록을 실행시킨다는 점에서는 똑같으나, 다만 메서드는 기본적으로 해당 클래스에서만 사용되도록 설계되어 있다.

 

쉽게 말해 메서드는 클래스에 종속적인 함수라 볼 수 있다. 함수는 클래스에 종속적이지 않다.

Stackoverflow에도 이런 질문을 한 사람이 있었다.

 

https://stackoverflow.com/questions/22913321/why-functions-are-called-methods-in-java

 

Why functions are called methods in java?

Why functions are called methods in java. I am not asking the difference between the two. Why Java community choose to name them methods. Is there any concrete reason behind this decision or it's j...

stackoverflow.com

물론 비슷하게 만들어서 사용할 수는 있다. 허나 자바에는 메서드만 있다.

 

자바 메서드

메서드를 사용하려면 new 키워드로 객체를 생성해야 하는데 static 키워드로 인스턴스 없이도 사용할 수 있도록 만들었다. (sum 메서드) 그러나 이런식으로 자바 프로그램을 설계하는 것은 자바 본연에서 벗어난 것 같다. 절대 하면 안된다는 것이 아니라 이게 원래의 방식이 아닌 것 같다.

 

자바에서 함수(function)가 없고 메서드(method)가 있는 이유는 자바가 추구하는 것이 무엇인지 알려준다. 객체와 멤버 변수, 메서드는 서로 독립된 것이 아니라 깊게 연관되어 있다.

 

예를 들어 사칙연산을 하기 위해서는 계산기를 하나의 객체로 바라보고 클래스로 만들 수 있다.

 

계산기의 멤버 변수는 숫자값을 저장할 메모리가 필요하고

 

기본적인 기능인 + - * / 사칙연산이 들어갈 것이고, 제곱근, 단위 변환 등 다양한 기능을 메서드로 추가 할 수 있다.

 

상속부분에서 다루는 내용이지만 계산기 클래스의 상속을 받아서 능력을 확장한 (Extends) 공학용 계산기, 프로그래머 계산기, GPS 계산기, 3차원 계산기 등을 만들어 낼 수 있다.

 

자바에서 함수를 설명하는 것은 훨씬 어렵다. 자바는 함수가 아니라 메서드를 사용한다. 함수에 대해 더 깊이 있는 이해는 C언어에서 배우는 것을 추천드린다. 리누즈 토발즈의 말처럼 C언어는 가장 하드웨어의 동작에 충실한 언어이고 C언어에는 함수가 중요하다.

 

* 메서드 

클래스의 멤버 변수를 조작하는데 있어서 메서드를 사용한다.

 

접근제어자를 알게 되서 private 과 public 변수의 차이점을 알게 되면 캡슐화(encapsulation)에 대해 더 잘 알게 될 것이다. 지금은 멤버 변수를 접근 하는 바람직한 방법은 클래스의 메서드를 통하는 것이라는 것만 알아도 충분하다.

 

이클립스를 사용해서 getter 와 setter를 만들어 본다.

 

클래스 파일을 우클릭 후 source -> generate getter and setter 를 클릭한다. 5-2의 Car1 클래스다.

 

color와 name을 체크하고 Generate를 클릭한다.

4개의 메서드가 자동으로 작성된다.

 

getter는 클래스를 통해서 멤버변수를 리턴한다.

 

setter는 클래스를 통해서 멤버변수를 정한다(set)

 

setName(String name) 을 보면 매개변수로 String 타입 변수 name 을 받고 this.name 에 대입한다.

 

this.name은 클래스의 멤버 변수이다. new 키워드로 Car1의 인스턴스 참조변수를 생성하면 고유의 객체가 생긴다.

 

this.name은 그 고유의 독립된 객체의 멤버 변수이다.

 

Car1View에서(튜토리얼 5-2) setter와 getter를 사용해보자.

 

 

클래스 메서드를 사용하기 위해서는 우선 Car1의 인스턴스를 만들어야 한다.

 

Car1 myCar1 = new Car1( );

 

Car1 클래스 형의 변수 myCar1을 선언하고 Car1을 new키워드를 사용하여 메모리에 생성하여 대입한다.

 

좀 어렵게 들리겠지만 생성자 챕터에 가면 이해할 것이다. (자바는 처음 배울 때 이렇게 앞과 뒤가 왔다갔다 한다. 자바의 정석 저자인 남궁성 교수님도 본인의 저서를 빠른 스피드로 3-4회 보라고 하셨다. 앞과 뒤를 넘나들어야 하므로... 처음에 100% 이해하는 것은 좀 어렵다.

 

그 다음 setter인 setName 메서드에 차종을 매개변수로 준다. myCar1. 의 . 점은 지금 만든 myCar1의 고유 인스턴스에 Toyota Camry 라는 문자열을 저장한다. 마찬가지로 setColor로 색상을 입력한다. 그러면 지금

 

myCar1.name ="Toyota Camry";

myCar1.color = "white";

 

가 된다.

 

이 멤버변수를 꺼내는 것이 setter이다.

 

myCar1.getName( );

myCar1.getColor( );

 

는 멤버변수를 리턴한다. 그냥 myCar1.name과 myCar1.color를 쓰면 되는데 왜 이렇게 복잡하게 하는지 의문이 있을 수 있다. 클래스 변수를 private name 과 private color 로 하면 클래스 바깥에서는 접근이 불가능하다. 오로지 같은 클래스의 메서드만 접근이 가능하다. 이 부분은 접근제어자에서 다루게 된다.

 

바깥에서 접근이 불가능하기 때문에 데이터에 더 신뢰성이 생기게 된다. 즉 멤버변수의 데이터는 정해진 메서드가 아니면 아무나 건드릴 수 없다는 것이다. 데이터를 외부에서 볼 수 없도록 은닉시키는 것이다. 이 부분이 절차적 프로그래밍의 C언어와 큰 차이가 있을 것이다. C언어는 배열과 포인터를 사용하면 메모리의 어느 부분에도 직접적인 Access가 가능하다. 자바는 불가능하게 막아놨다.

 

복잡하지만 너무 고민하지 말고 다음 단계로 넘어가자.

공유하기

facebook twitter kakaoTalk kakaostory naver band