메서드 (컴퓨터 프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
메서드는 컴퓨터 프로그래밍에서 객체의 동작을 정의하는 서브루틴 또는 함수를 의미하며, 객체 지향 프로그래밍의 핵심 개념 중 하나이다. 스몰토크의 영향을 받아 자바 등 다양한 언어에서 널리 사용되며, 인스턴스 메서드, 클래스 메서드, 접근자 메서드, 추상 메서드, 가상 메서드 등 여러 종류가 있다. 메서드는 객체의 캡슐화를 구현하고, 상속, 오버라이딩, 오버로딩을 통해 코드의 재사용성과 유지보수성을 높이는 데 기여한다.
더 읽어볼만한 페이지
- 메소드 (컴퓨터 프로그래밍) - 소멸자 (컴퓨터 프로그래밍)
소멸자는 객체가 메모리에서 제거되기 직전에 호출되는 멤버 함수로, 객체 자원 해제 및 정리 작업을 수행하며, C++ 등 여러 언어에서 구현되고 메모리 누수 방지에 기여한다. - 메소드 (컴퓨터 프로그래밍) - 동적 디스패치
동적 디스패치는 프로그램 실행 시 호출할 메서드를 결정하는 메커니즘으로, 단일 또는 다중 객체 기준으로 선택하며, 유연성과 확장성을 높이지만 성능 오버헤드를 발생시킬 수 있다. - 객체 지향 프로그래밍 - Is-a
Is-a 관계는 객체 지향 프로그래밍에서 한 유형이 다른 유형의 하위 유형임을 나타내는 관계로, 상속, 서브타이핑, 리스코프 치환 원칙과 관련되며, C++, Python, Java 등에서 표현된다. - 객체 지향 프로그래밍 - 객체 (컴퓨터 과학)
객체는 객체 지향 프로그래밍에서 데이터와 조작을 묶어 메시지를 수신하고, 프로그램의 개념을 표현하며 가시성과 재사용성을 높이는 실체이다.
메서드 (컴퓨터 프로그래밍) | |
---|---|
일반 정보 | |
의미 | 객체 내에서 특정 작업을 수행하는 코드 블록 |
다른 이름 | 함수 (function) 프로시저 (procedure) 서브루틴 (subroutine) |
특징 | |
소속 | 클래스 또는 객체에 소속됨 |
호출 방식 | 객체를 통해 호출됨 (예: object.method()) |
역할 | 객체의 상태를 변경하거나 특정 값을 반환 |
구성 요소 | 이름 (name) 매개변수 (parameters) 반환 값 (return value) |
유형 | |
인스턴스 메서드 (instance method) | 특정 객체에 작용 |
클래스 메서드 (class method) | 클래스 자체에 작용 |
정적 메서드 (static method) | 클래스 또는 객체와 관련이 없지만 클래스 내에 정의됨 |
바인딩 | |
정의 | 이름과 클래스 간의 연결 |
시점 | 정적 바인딩 (static binding): 컴파일 시 결정 동적 바인딩 (dynamic binding): 런타임 시 결정 |
추가 정보 | |
상속 (inheritance) | 하위 클래스가 상위 클래스의 메서드를 상속받아 재사용 가능 |
다형성 (polymorphism) | 동일한 이름의 메서드가 다른 클래스에서 다르게 동작 가능 |
오버로딩 (overloading) | 동일한 클래스 내에서 매개변수 목록이 다른 여러 개의 메서드를 가질 수 있음 |
오버라이딩 (overriding) | 하위 클래스가 상위 클래스의 메서드를 재정의할 수 있음 |
2. 역사적 배경
메서드라는 용어는 객체 지향 프로그래밍 언어의 발전과 함께 진화해 왔다. 스몰토크는 시뮬라의 '멤버 프로시저'를 '메시지'와 '메서드'로 나누어 객체 지향 프로그래밍의 핵심 개념으로 정립했다.[7] C++에서는 '멤버 함수'라고 부르는데, 이는 시뮬라의 멤버 프로시저를 C 언어에 유용하게 사용한 데서 유래한다.[7] Java나 마이크로소프트[7] 등이 메서드라는 용어를 사용하는 것은 스몰토크의 영향 때문이다. 최근에는 언어 설계나 OS 개발 등에서 직접 스몰토크의 영향을 받지 않은 경우에도, Java나 마이크로소프트 등의 영향으로 멤버 프로시저나 멤버 함수에 해당하는 것을 메서드라고 부르는 것이 일반화되었다.
메서드는 서브클래스화될 때 오버라이드될 수 있으며, 실제로 발생하는 동작(행위)은 리시버에 의존한다. 이를 다형성 (폴리모피즘)이라고 한다. 통합 모델링 언어 (UML)에서는 메서드를 연산 (operation)이라고 부른다.
2. 1. 초기 개념
객체 지향 프로그래밍에서 메서드라는 용어는 원래 스몰토크가 시뮬라의 '''멤버 프로시저''' (member procedure영어)를 '''메시지'''와 '''메서드'''로 나누기 위해 도입했다. C++에서는 '''멤버 함수'''라고 불리는데, 이는 시뮬라의 멤버 프로시저를 C 언어에 유용하게 사용한 데서 유래한다.[7]2. 2. 스몰토크의 영향
스몰토크는 시뮬라의 '멤버 프로시저'를 '메시지'와 '메서드'로 나누어 객체 지향 프로그래밍의 핵심 개념으로 정립했다.[7] Java와 같은 언어에서 '메서드'라는 용어가 널리 사용되는 것은 스몰토크의 영향 때문이다.[7]2. 3. C++의 영향
C++는 C 프로그래밍 언어를 객체 지향적으로 확장한 것이다. C++는 기존 절차적 언어에 객체 지향 패러다임을 추가하면서 C와의 호환성을 고려해야 했기 때문에, 메시지 전달 방식에서 몇 가지 고유한 기능과 용어를 사용한다. 예를 들어, C++에서 메서드는 '멤버 함수'라고 불린다.[7] 또한, 파생 클래스에서 메서드 재정의가 가능하고 동적 디스패치를 허용하는 가상 함수 개념도 가지고 있다.객체 지향 프로그래밍에서 '메서드'라는 용어는 원래 스몰토크가 시뮬라의 '멤버 프로시저' (member procedure영어)를 '메시지'와 '메서드'로 나누기 위해 도입한 것이다. C++에서는 이를 '멤버 함수'라고 부르는데, 이는 시뮬라의 멤버 프로시저를 C 언어에서 유용하게 사용한 데서 유래한다.[7]
C++에서 멤버 함수는 클래스에 속하지 않는 함수인 전역 함수 (글로벌 함수 또는 프리 함수)와 대비된다.
C++는 클래스형 객체나 리플렉션을 지원하지 않으며, 클래스 자체를 어떤 변수에 대입하는 것은 불가능하다.[10]
3. 메서드의 종류
객체 지향 프로그래밍에서 메서드라는 용어는 스몰토크가 시뮬라의 '멤버 프로시저'를 '메시지'와 '메서드'로 나누면서 시작되었다. C++에서는 '멤버 함수'라고 부르는데, 이는 시뮬라의 멤버 프로시저를 C 언어에서 활용한 것에서 유래한다. Java 등은 스몰토크의 영향을 받아 메서드라는 용어를 사용한다.[7] 최근에는 Java 등의 영향으로 멤버 프로시저나 멤버 함수를 메서드라고 부르는 것이 일반화되었다.
스몰토크나 Objective-C에서는 메시지와 메서드를 명확하게 구분한다.[8] 메시지와 메서드가 구분된 언어에서는 하나의 메서드에 대해 선택자가 다른 여러 메시지를 보낼 수 있다.[9]
메서드와 일반 함수의 주요 차이는 인스턴스 내부 접근 여부이다. 클래스에 속하는 필드 및 메서드는 접근성을 설정할 수 있으며, 권한이 없는 코드 영역에서는 참조나 호출이 불가능하다. 이를 캡슐화라고 하며, 이는 클래스 정의의 추상화에 기여한다. 호출 시 조작 대상 인스턴스는 `this`나 `self` 같은 키워드, 또는 메서드에 전달된 인수로 참조할 수 있다. C++에서는 클래스에 속하지 않는 전역 함수와 대비된다.
메서드는 서브클래스에서 오버라이드될 수 있으며, 실제 동작이 리시버(메시지를 받는 객체)에 의존하는 다형성 특징을 갖는다.
통합 모델링 언어 (UML)에서는 메서드를 연산이라고 부른다.
3. 1. 인스턴스 메서드와 클래스 메서드
인스턴스에 속하는 메서드를 '''인스턴스 메서드'''(instance method영어)라고 하며, 인스턴스에 메시지를 보내 실행한다. 인스턴스 변수를 조작하는 데 사용되며, 객체 지향 프로그래밍의 핵심을 이루며 가장 많이 사용된다.클래스에 속하는 메서드를 '''클래스 메서드'''(class method영어)라고 하며, 클래스에 메시지를 보내 실행한다. 클래스 변수를 조작하거나 객체 생성 등에 사용된다. 많은 객체 지향 언어는 메타클래스를 지원하며, 클래스 객체의 조작 수단이 된다. C++나 Java와 같은 객체 지향 언어에서는 '''정적 멤버 함수''' 또는 '''정적 메서드''' (static method영어)라고 불리며, 그 동작은 클래스 변수 조작이 허용된다는 점을 제외하면 비 객체 지향 언어에서의 함수나 프로시저와 다르지 않다.
다음은 Java로 작성된 인스턴스 메서드와 정적 메서드(클래스 메서드)의 예시이다. Java에서는 `static` 수식어가 붙은 메서드가 정적 메서드이며, 붙어 있지 않으면 인스턴스 메서드이다.[7]
public class MethodSample {
/** 인스턴스 필드 */
private String name;
/** 클래스 필드 */
private static int number;
/** 인스턴스를 생성하기 위한 생성자 */
public MethodSample(final String name) {
this.name = name;
}
/** 인스턴스 메서드, getter */
public String getName() {
return this.name;
}
/** 정적 메서드, getter */
public static int getNumber() {
return MethodSample.number;
}
/** 정적 메서드, setter */
public static void setNumber(final int number) {
MethodSample.number = number;
}
}
스몰토크와 마찬가지로 인스턴스 메서드를 호출하려면, 먼저 생성자를 호출하여 인스턴스를 생성해야 한다.
MethodSample objectA = new MethodSample("John");
MethodSample objectB = new MethodSample("Joe");
위 예시는 Smalltalk 예시에서의 인스턴스 객체 생성과 동일하게 동작한다. C++ 표기를 따른 Java에서는 new 연산자를 사용하여 인스턴스를 생성한다.
인스턴스 메서드를 호출하려면 다음과 같이 작성한다.
objectA.getName(); // "John"을 반환
objectB.getName(); // "Joe"를 반환
위 예시는 Smalltalk 예시에서의 인스턴스 메서드 호출과 동일하게 동작한다.
클래스 메서드를 호출하려면 다음과 같이 작성한다.
MethodSample.setNumber(100);
MethodSample.getNumber(); // 100을 반환
위 예시는 Ruby 예시에서의 직접 클래스 이름을 지정한 클래스 메서드 호출과 동일하게 동작한다.
Java에서는 메타클래스로 클래스를 지원한다. 메서드를 통해 `Class`형 객체를 얻을 수 있다. 또한, `클래스명.class`라는 구문으로 `Class`형 객체를 얻을 수도 있다. 게다가 리플렉션을 사용하여 `Class`형 객체로부터 메서드를 호출하거나, 필드에 접근하는 것도 가능하다.
.NET Framework에서는 메타클래스로 `System.Type` 클래스를 지원한다. `System.Object.GetType()` 메서드를 통해 `Type`형 객체를 얻을 수 있다. C#에서는 `typeof` 연산자를 통해 타입 심볼로부터 `Type`형 객체를 얻을 수도 있다. 또한, 리플렉션도 지원하고 있다.
C++는 클래스형 객체나 리플렉션을 지원하지 않으며, 클래스 자체를 어떤 변수에 대입하는 것은 불가능하다.[10]
3. 2. 접근자 메서드와 상태변이 메서드
접근자 메서드는 객체의 데이터 값을 읽는 데 사용되는 메서드이다. 흔히 'getter'라고 불린다. 상태변이 메서드는 객체의 상태를 변경하는 메서드로, 'setter'라고 불린다.[2]'''액세서''' (accessor영어)는 특히 객체가 가진 필드에 간접적으로 접근하기 위해 정의되는 메서드의 총칭이다. 필드에 값을 설정(set)하는 메서드를 세터(setter), 필드에서 값을 취득(get)하는 메서드를 게터(getter)라고 부른다. 통상, 개별 필드에 대해 개별 액세서가 준비된다. 즉, 세터는 단일 입력을 가지며, 게터는 단일 출력을 가진다. 하나의 필드에 대해 세터/게터가 대칭적으로 양쪽 모두 준비되는 경우도 있고, 한쪽만 준비되는 경우도 있다.
이러한 메서드는 캡슐화와 모듈성을 용이하게 하는 추상화 계층을 제공한다. 예를 들어, 은행 계좌 클래스가 현재 잔고를 검색하기 위해 `getBalance()` 접근자 메서드를 제공하는 경우(잔고 데이터 필드에 직접 접근하는 대신), 동일한 코드의 이후 개정에서는 잔고 검색을 위한 더 복잡한 메커니즘(예: 데이터베이스 가져오기)을 구현할 수 있으며, 종속 코드는 변경할 필요가 없다.[2]
접근자 메서드 작성 기법기법은 언어에 따라 다르다.
언어 | 접근자 메서드 작성 기법 |
---|---|
Java 계열 | getXXX, setXXX와 같이 어간부에 접근 대상 명사가 들어간다. |
스몰토크 계열 | XXX, XXX:와 같이 접근 대상의 이름만 기술하고, 입력과 출력을 인수의 유무로 구분한다. |
Objective-C | XXX, setXXX:와 같이 한쪽에만 set을 붙이는 명명 규칙을 사용한다. |
델파이, C# 등 | 프로퍼티 기능을 가진 많은 언어에서는 프로퍼티 자체가 엑세서에 해당하며, 전용 구문을 사용한다. |
루비 | 메서드 호출 시 인수를 묶는 괄호를 생략할 수 있으므로, 인수를 갖지 않는 메서드 호출이 읽기용 엑세서에 해당하지만, 쓰기용 엑세서에는 XXX=라는 구문이 존재한다. |
C++ | 정해진 규칙이 없고 라이브러리나 개발 환경에 따라 달라진다. |
접근자 메서드 사용 논쟁스몰토크와 같은 언어에서는 인스턴스 및 클래스 내의 변수를 외부에서 조작할 수 없으며, 반드시 메시지를 사용한 조작이 필요하다. 반면, C++ 등에서는 `public` 변수에 대한 직접 조작이 종종 사용된다.
- 효율성 문제: 메서드를 일일이 호출하는 비용을 피하고 싶은 경우. 그러나 대부분은 컴파일러 최적화에 의한 인라인화로 해결할 수 있다.
- 기술량 문제: 단순히 값을 설정/취득하는 일에 모두 메서드를 기술하는 것은 잘못되었다는 생각.
캡슐화나 다형성의 관점에서, 액세서를 사용하지 않는 변수 참조는 장래에 걸쳐 변경 내구성과 확장성이 현저히 떨어진다는 주장이 있다. 또한 표기의 일관성에서 액세서를 지시하는 측도 있다. 반면 부정파는 "강력한 IDE를 사용하면 리팩토링이 가능하며, 오히려 필드에 대한 직접 액세스를 사용하는 것이 의미가 명확해진다"는 주장을 펼친다.
오브젝트 파스칼은 이러한 반성에서, 변수를 나중에 액세서화할 수 있는 기법으로 프로퍼티를 도입했다. 또한 루비 등, 액세서를 쉽게 정의할 수 있는 메서드나 구문을 갖춘 언어도 있다.
3. 3. 추상 메서드
추상 메서드는 구현 없이 선언만 되어 있는 메서드이다. 서브 클래스는 반드시 메서드를 구현해야 한다. 추상 메서드는 언어에서 인터페이스를 명시하는 데 사용된다.[5]자바에서 추상 클래스를 정의하는 코드 예시는 다음과 같다.
```java
abstract class Shape {
abstract int area(int h, int w); // 추상 메서드 시그니처
}
```
다음은 위 클래스를 확장하는 하위 클래스이다.
```java
public class Rectangle extends Shape {
@Override
int area(int h, int w) {
return h * w;
}
}
```
C#에서는 가상 메서드를 추상 메서드로 재정의할 수 있다. (이는 모든 비공개 메서드가 가상인 Java에도 적용된다.)
```csharp
class IA
{
public virtual void M() { }
}
abstract class IB : IA
{
public override abstract void M(); // 허용
}
```
인터페이스의 기본 메서드도 다시 추상화될 수 있으며, 하위 클래스에서 이를 구현해야 한다. (이는 Java에도 적용된다.)
```csharp
interface IA
{
void M() { }
}
interface IB : IA
{
abstract void IA.M();
}
class C : IB { } // 오류: 클래스 'C'는 'IA.M'을 구현하지 않습니다.
```
'''추상 메서드''' (abstract method영어)는 가상 메서드의 일종으로, 메서드 구현 없이 선언만 되어 있는 것을 말한다. C++에서는 '''순수 가상 함수''' (pure virtual function영어)라고 불린다. 추상 메서드를 이용하려면, 이 메서드를 포함하는 클래스를 상속하고, 거기서 이 메서드를 오버라이드하여 구현해야 한다. 따라서, 추상 메서드를 포함하는 클래스는 상속하지 않는 한 인스턴스화할 수 없다. 이러한 클래스를 '''추상 클래스'''라고 부른다.
'''구상 메서드''' (concrete method영어)는 추상 메서드의 반대 개념으로, 구현을 가진 메서드를 말한다. 주로 추상 메서드를 오버라이드한 인스턴스 메서드를 의미한다.
Java 및 C#에서는 `abstract` 수식어를 사용하여 추상 메서드를 선언할 수 있다. 추상 메서드를 가진 클래스 자체도 반드시 `abstract` 수식어를 사용하여 추상 클래스로 정의해야 한다.
추상 메서드는 디자인 패턴 중 하나인 템플릿 메서드 패턴에서 주요한 역할을 하며, 소프트웨어의 확장성, 재사용성, 범용성을 높이는 데 기여한다.
또한, 추상 메서드만 갖는 추상형으로, Java 및 C#에서는 인터페이스 (interface)를 정의할 수 있다. Java 및 C#에서 클래스는 다중 상속이 불가능하지만, 인터페이스를 여러 개 구현하는 것은 가능하다.
3. 4. 가상 메서드 (C++)
C++에서 '''가상 함수'''는 파생 클래스에서 메서드 재정의가 가능하고 동적 디스패치를 허용하는 멤버 함수이다. C++ 클래스가 다형성을 달성할 수 있는 수단이기도 하다. 반면, ''비가상 멤버 함수'' 또는 ''일반 메서드''는 다형성에 참여하지 않는 함수이다.[7]C++ 예시:
```cpp
#include
#include
class Super {
public:
virtual ~Super() = default;
virtual void IAm() { std::cout << "나는 상위 클래스야!\n"; }
};
class Sub : public Super {
public:
void IAm() override { std::cout << "나는 하위 클래스야!\n"; }
};
int main() {
std::unique_ptr
std::unique_ptr
inst1->IAm(); // |Super::IAm| 호출.
inst2->IAm(); // |Sub::IAm| 호출.
}
```
C++에서 일반적으로 가상 함수는 컴파일 시에 어떤 멤버 함수를 호출할지 확정할 수 없기 때문에, 일반적인 비가상 멤버 함수 호출보다 성능이 나쁘다는 단점이 있다. 따라서 성능을 중시하는 C++ 프로그래머는 상속할 필요가 없는 클래스의 멤버 함수(특히 소멸자 포함)에 `virtual` 수식어를 붙이는 것을 매우 꺼리는 경향이 있다. 또한, C++에는 템플릿이라는 기능이 존재하며, 대부분의 경우 가상 함수는 템플릿으로 대체할 수 있기 때문에 가상 함수에 얽매일 필요가 없다. 다만, 소멸자가 비가상인 경우, 파생 클래스 인스턴스의 다형적인 delete가 불가능해진다는 편리성 및 안전상의 단점도 발생한다.[12][13]
3. 5. 기타 메서드
생성자는 객체의 수명 시작 시점에 호출되어 객체를 생성하고 초기화하는 메서드이다. 이 과정을 생성(또는 "인스턴스화")이라고 한다. 초기화에는 자원 획득이 포함될 수 있다. 생성자는 매개변수를 가질 수 있지만, 대부분의 언어에서 일반적으로 값을 반환하지 않는다. 다음은 자바의 예시이다.public class Main {
String _name;
int _roll;
Main(String name, int roll) { // 생성자 메서드
this._name = name;
this._roll = roll;
}
}
소멸자는 객체의 수명이 다할 때 자동으로 호출되는 메서드이며, 이 과정을 소멸이라고 한다. 대부분의 언어에서 소멸 시 소멸자 메서드 인수를 허용하지 않으며 반환값도 없다. 소멸자는 객체 소멸 시 정리 작업 및 기타 작업을 수행하도록 구현할 수 있다. 가비지 컬렉션을 사용하는 언어, 예를 들어 자바[3], C#[4], 파이썬과 같은 언어에서 소멸자는 ''finalizer''라고 불린다. 소멸자와 비슷한 목적과 기능을 가지고 있지만, 가비지 컬렉션을 사용하는 언어와 수동 메모리 관리를 하는 언어의 차이점 때문에 호출되는 순서가 다르다.
복사 할당 연산자는 클래스 객체가 동일한 유형의 클래스 객체에 할당될 때 컴파일러가 수행할 작업을 정의한다.
연산자 메서드는 연산자 기호를 정의하거나 재정의하며, 해당 기호와 관련된 메서드 매개변수를 사용하여 수행할 연산을 정의한다. C++ 예시는 다음과 같다.
#include
class Data {
public:
bool operator<(const Data& data) const { return roll_ < data.roll_; }
bool operator==(const Data& data) const {
return name_ == data.name_ && roll_ == data.roll_;
}
private:
std::string name_;
int roll_;
};
4. 메서드 오버라이딩과 오버로딩
메서드 오버라이딩과 오버로딩은 메서드가 기존의 프로시저 또는 함수 호출과 다른 가장 중요한 두 가지 방법이다. 오버라이딩은 하위 클래스가 상위 클래스의 메서드 구현을 재정의하는 것을 의미한다.[6] 예를 들어, `findArea`는 도형 클래스에 정의된 메서드일 수 있으며, `삼각형` 등은 각자의 면적을 계산하기 위한 적절한 공식을 정의할 것이다.
반면에, 메서드 오버로딩은 메서드의 매개변수를 기반으로 메시지를 처리하는 데 사용되는 코드를 구별하는 것을 의미한다. 수신 객체를 모든 메서드의 첫 번째 매개변수로 간주하면 오버라이딩은 선택이 첫 번째 인수에 의해서만 이루어지는 오버로딩의 특수한 경우일 뿐이다.
UML에서는 메서드를 연산 (operation)이라고 부른다.
인수의 수, 형식, 순서 등이 다른 동일한 이름의 메서드를 정의하는 것을 메서드의 다중 정의라고 하며, 많은 객체 지향 언어에서는 메서드나 생성자를 다중 정의할 수 있는 기능을 가지고 있다. 오버로드(overload)라고도 불리지만, 오버라이드와의 혼동에 주의해야 한다.
다만, PHP나 펄처럼 프로그래밍 언어에 따라 형식의 모호함 때문에 메서드를 다중 정의할 수 없는 경우도 있다. 이 경우에는 메서드의 인수를 메서드 시작 부분에서 읽어 들여, 인수의 형식을 판별하는 조건 분기로 대응한다.
5. 캡슐화와 메서드
메서드는 캡슐화를 구현하는 데 중요한 역할을 한다. 메서드는 객체의 데이터를 외부로부터 보호하고, 데이터에 대한 접근을 제어한다.[2]
접근자 메서드는 객체의 데이터를 읽는 데 사용되며, 객체의 상태에 접근할 수 있다. 변경자 메서드는 객체의 데이터를 수정하는 데 사용된다. 예를 들어, 은행 계좌 클래스에서 잔고를 확인하는 `getBalance()` 메서드는 접근자 메서드이며, 잔고 데이터 필드에 직접 접근하는 대신 이 메서드를 사용하면, 나중에 잔고를 가져오는 방식(예: 데이터베이스에서 가져오기)이 변경되어도 코드를 수정할 필요가 없다.[2]
클래스에 속하는 필드와 메서드에는 접근 권한을 설정할 수 있으며, 권한이 없는 코드에서는 참조하거나 호출할 수 없다. 이는 캡슐화라고 불리며, 클래스 정의의 추상화에 기여한다.
'''액세서'''(accessor영어)는 객체의 필드에 간접적으로 접근하기 위한 메서드를 말한다. 필드 값을 설정하는 메서드를 세터(setter), 값을 가져오는 메서드를 게터(getter)라고 한다. 보통 각 필드마다 액세서가 있으며, 세터는 하나의 입력을, 게터는 하나의 출력을 가진다.
Java에서는 `getXXX`, `setXXX`처럼 접근 대상 이름이 들어간다. 스몰토크에서는 `XXX`, `XXX:`처럼 이름만 쓰고, 입력과 출력을 인수로 구분한다. Objective-C에서는 `XXX`, `setXXX:`처럼 한쪽에만 `set`을 붙인다. 델파이나 C# 등은 프로퍼티 기능을 사용하여 액세서를 처리한다.
스몰토크 같은 언어에서는 객체 내 변수를 외부에서 조작할 수 없고, 반드시 메시지를 사용해야 한다. 반면, C++ 등에서는 `public` 변수를 직접 조작하기도 한다.
6. 추상화 (Abstract)
객체 지향 프로그래밍에서 메서드는 스몰토크가 시뮬라의 '멤버 프로시저'를 '메시지'와 '메서드'로 나누면서 도입한 용어이다. C++에서는 '멤버 함수'라고 부르는데, 이는 시뮬라의 멤버 프로시저를 C 언어에 활용한 데서 유래한다. Java나 마이크로소프트[7] 등이 메서드라는 용어를 사용하는 것은 C++보다 스몰토크의 영향을 받았기 때문이다.
메서드는 일반 함수와 달리 인스턴스 내부로 접근할 수 있다. 클래스에 속하는 필드 및 메서드에는 접근성(접근 레벨)을 설정할 수 있으며, 접근 권한이 없는 코드 영역에서는 참조하거나 호출할 수 없다. 이 기능은 캡슐화라고 불리며, 클래스 정의의 추상화에 기여한다.
메서드는 서브클래스에서 오버라이드될 수 있으며, 실제 동작이 리시버(인스턴스)에 의존하는 다형성 특징을 갖는다.
통합 모델링 언어 (UML)에서는 메서드를 연산 (operation)이라고 부른다.
많은 언어에서 필드를 공개(public) 상태로 두면 객체의 필드를 메서드를 거치지 않고 직접 읽고 쓸 수 있지만, 캡슐화를 위해 액세서(accessor)를 통해 필드를 읽고 쓰는 경우가 많다. 액세서를 사용하면 다음과 같은 장점이 있다.
참조
[1]
웹사이트
What is an Object?
http://docs.oracle.c[...]
Oracle Corporation
2013-12-13
[2]
서적
Object-Oriented Software Construction
Prentice Hall International Series in Computer Science
[3]
서적
"Effective Java: Programming Language Guide"
Addison-Wesley
[4]
서적
C# 10 in a Nutshell
O'Reilly
[5]
웹사이트
Abstract Methods and Classes
http://docs.oracle.c[...]
Oracle Java Documentation
2014-12-11
[6]
서적
Clean Code: A Handbook of Agile Software Craftsmanship
Prentice Hall
[7]
문서
MFC、COM、.NET Frameworkではメソッドという用語が使われる。
[8]
문서
SmalltalkやObjective-Cではメッセージ転送の仕組みによりオブジェクトが受信したメッセージを取得することができる。また、Objective-Cではメソッドを操作するために [https://opensource.apple.com/source/objc4/objc4-709/runtime/runtime.h.auto.html class_getInstanceMethod]といったMethodが付く関数やメソッドを提供しており、メッセージを操作するためには [https://opensource.apple.com/source/objc4/objc4-237/runtime/objc-runtime.h.auto.html objc_msgSend]といったmsgが付く関数やメソッドを提供している。
[9]
문서
例えばSmalltalkでは"#addSelector:withMethod:"により既存のメソッドにセレクターを追加できる。[https://www.gnu.org/software/smalltalk/manual-base/html_node/Behavior_002dmethod-dictionary.html]また[[メッセージ転送]]により複数のメッセージを一つのメソッドで受け取ることができる。
[10]
문서
C++において、obj.staticMemberFunc()
のようにインスタンスから静的メンバー関数を呼び出す[[糖衣構文]]はサポートされるが、クラス自体をオブジェクトとして扱うことはできない。
[11]
뉴스
Javaにおけるメソッド呼出しの仕組み | Java Magazine | Oracle
https://www.oracle.c[...]
[12]
뉴스
Performance Tips and Tricks in .NET Applications | Microsoft Docs
https://docs.microso[...]
[13]
뉴스
Writing Faster Managed Code: Know What Things Cost | Microsoft Docs
https://docs.microso[...]
[14]
뉴스
パフォーマンスに関するヒント | Android デベロッパー | Android Developers
https://web.archive.[...]
Internet Archive
[15]
뉴스
Javaの理論と実践: ファイナル・アンサー? finalキーワードを有効に使用するためのガイドライン | IBM
https://web.archive.[...]
Internet Archive
[16]
뉴스
Javaの理論と実践: パフォーマンスの都市伝説 | IBM
https://web.archive.[...]
Internet Archive
[17]
뉴스
プロパティ - C# プログラミング ガイド | Microsoft Docs
https://docs.microso[...]
[18]
문서
C++/Java/C#の場合、イミュータブルに関してはpublicなconst/final/readonlyフィールドで代用することが可能なケースも存在する。この場合、getterも不要である。
[19]
문서
そのほか、C/C++ではコピーのコストを避けるため、関数の戻り値ではなくポインタあるいは参照による引数経由で値を返すことがあるが、コピー省略 (copy elision) およびReturn Value Optimization (RVO) をサポートするコンパイラでは、戻り値で返したとしても不要なコピー処理は除去される。[https://ja.cppreference.com/w/cpp/language/copy_elision コピー省略 - cppreference.com]
[20]
웹사이트
Properties (Delphi) - RAD Studio
https://docwiki.emba[...]
2023-10-13
[21]
웹인용
Methods
http://www.rubyist.n[...]
Ruby User's Guide
2011-08-12
[22]
웹인용
OOPS Interview Questions: 17. What is Binding?
http://www.tolmol.co[...]
TOLMOL Beta
2011-08-12
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com