[function] 메소드와 함수의 차이점은 무엇입니까?

누군가 OOP 컨텍스트에서 메소드함수 에 대한 간단한 설명을 제공 할 수 있습니까 ?



답변

기능은 이름에 의해 호출되는 코드의 조각이다. 작동 할 데이터 (예 : 매개 변수)를 전달하고 선택적으로 데이터 (반환 값)를 리턴 할 수 있습니다. 함수에 전달 된 모든 데이터는 명시 적으로 전달됩니다.

방법은 객체와 연관된 이름으로 호출 코드의 조각이다. 대부분의 경우 두 가지 주요 차이점을 제외하고 함수와 동일합니다.

  1. 메소드는 메소드가 호출 된 오브젝트를 내재적으로 전달합니다.
  2. 메소드는 클래스 내에 포함 된 데이터에 대해 조작 할 수 있습니다 (객체는 클래스의 인스턴스임을 기억하십시오. 클래스는 정의이고 오브젝트는 해당 데이터의 인스턴스 임).

(이것은 범위 문제 등을 무시하고 단순화 된 설명입니다 .)


답변

메소드가 오브젝트에 있습니다.
함수는 객체와 무관합니다.

Java 및 C #의 경우 메소드 만 있습니다.
C의 경우 기능 만 있습니다.

C ++ 및 Python의 경우 클래스에 있는지 여부에 따라 다릅니다.


답변

‘method’‘function’에 대한 객체 지향 단어입니다 . 그것은 거의 모든 것입니다 (즉, 실제 차이는 없습니다).

불행히도, 여기에 많은 답변이 복잡하고 의미있는 차이가 있다는 생각을 지속 시키거나 발전시키고 있다고 생각합니다.

실제로-그다지 많지는 않지만 같은 것에 대해 다른 단어가 있습니다.

【늦은 추가】


실제로 Brian Neal 이이 질문 에 대한 의견에서 지적했듯이 C ++ 표준은 멤버 함수를 참조 할 때 ‘방법’이라는 용어를 사용하지 않습니다. 어떤 사람들은 C ++이 실제로 객체 지향 언어가 아니라는 표시로 받아 들일 수 있습니다. 그러나 나는 꽤 똑똑한 사람들이 다른 용어를 사용해야 할 특별한 이유가 있다고 생각하지 않았다는 것을 나타내는 것으로 선호합니다.


답변

일반적으로 : 메소드는 클래스에 속하는 함수이며 함수는 코드의 다른 범위에있을 수 있으므로 모든 메소드가 함수이지만 모든 함수가 메소드가 아님을 진술 할 수 있습니다.

다음 파이썬 예제를 보자.

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

주어진 예는 “open”이라는 메소드 또는 조치가있는 “Door”라는 클래스를 보여줍니다. 클래스 내에서 선언 되었기 때문에 메소드라고합니다. 함수를 정의하는 바로 아래에 “def”가있는 코드의 또 다른 부분이 있습니다.이 함수는 클래스 내에서 선언되지 않았기 때문에 함수입니다.이 함수는 클래스 내부에서 정의한 메소드를 호출 할 수 있습니다. 자체적으로 호출됩니다.

보시다시피 어디서나 함수를 호출 할 수 있지만 메소드를 호출하려면 클래스와 동일한 유형의 새 객체를 전달해야합니다 (클래스. 메소드 (객체)). 적어도 파이썬에서 객체 내부의 메소드 (object.Method ()).

메소드를 하나의 엔티티 만 수행 할 수있는 것으로 생각하십시오. 따라서 Dog 클래스가있는 경우 해당 클래스 내부에만 껍질 함수가있는 것이 합리적이며 Person 클래스도있는 경우 메소드가됩니다. 인간과 개 모두에게 먹이를 줄 수 있기 때문에 어떤 클래스에도 속하지 않는 함수 “피드”를 작성하십시오. 특히 어떤 클래스에도 속하지 않기 때문에 함수를 호출 할 수 있습니다.


답변

기억하는 간단한 방법 :

  • F의 → 기름 부음 F의 REE는 (무료는 객체 나 클래스에 속하지 의미)
  • M은 → ethod M의 엠버 (객체 또는 클래스의 멤버)

답변

함수메소드 의 주요 차이점에 대한 매우 일반적인 정의 :

함수는 클래스 외부에서 정의되는 반면 메서드는 클래스 내부 및 일부에서 정의됩니다.


답변

여기에서 읽고 싶은 느낌이 든다면 “OO 방법에 대한 나의 소개”입니다.

객체 지향 패러다임의 기본 개념은 소프트웨어가 .. 잘 “객체”로 구성되어 “위협”하는 것입니다. 실제 세계의 개체에는 속성이 있습니다. 예를 들어 직원이 있거나 직원의 이름, 직원 ID, 직책, 부서에 속한 사람 등이 있습니다.

객체는 또한 속성을 처리하고 일부 작업을 수행하는 방법을 알고 있습니다. 직원이 지금하고있는 일을 알고 싶다면 그에게 물을 것입니다.

employe whatAreYouDoing.

“whatAreYouDoing”은 객체로 전송 된 “메시지”입니다. 그 대상은 그 질문에 대답하는 방법을 알고 있으며 질문을 해결하는 “방법”이 있다고합니다.

따라서 객체가 동작을 노출시키는 방식을 메소드라고합니다. 따라서 아티팩트 객체는 무언가를 “해야”합니다.

다른 가능한 방법은

employee whatIsYourName
employee whatIsYourDepartmentsName

기타

반면 함수는 프로그래밍 언어가 일부 데이터를 계산하는 방법입니다. 예를 들어 16을 반환하는 addValues ​​(8, 8) 함수가있을 수 있습니다.

// pseudo-code
function addValues( int x, int y )  return x + y
// call it
result = addValues( 8,8 )
print result // output is 16...

fortran, c, pascal과 같은 인기있는 프로그래밍 언어는 OO 패러다임을 다루지 않았으므로 이러한 아티팩트를 “함수”라고 부릅니다.

예를 들어 C의 이전 함수는 다음과 같습니다.

int addValues( int x, int y )
{
   return x + y;
}

직원에게는 수학이 거의 없지만 함수는 수학과 더 관련이 있기 때문에 객체에 어떤 동작을 수행하는 “기능”이 있다고 말하는 것은 “자연스럽지 않습니다”. 예를 들어 Java에서는 동등한 addValues ​​함수가됩니다.

public static int addValues( int x, int y ) {
    return x + y;
}

익숙해 보이나요? Java가 C ++에 뿌리를두고 C에 C ++를 뿌리고 있기 때문입니다.

결국은 개념 일 뿐이며, 구현에서는 그것들이 동일하게 보일 수 있지만, OO 문서에서는 이것을 메소드라고합니다.

다음은 Java의 이전 Employee 객체의 예입니다.

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    }
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

차이점은 적용되는 “도메인”에 있습니다.

AppleScript는 어느 시점에서 OO가 가지고 있던 “자연어”성숙도라는 아이디어를 가지고 있습니다. 예를 들어 스몰 토크. 이것을 읽은 후에 객체의 메소드를 이해하는 것이 합리적 일 수 있기를 바랍니다.

참고 : 코드는 예제로 사용하기 위해 컴파일되지 않습니다. 게시물을 수정하고 Python 예제를 추가하십시오.