function - object oriented programming




방법과 기능의 차이점은 무엇입니까? (20)

방법과 기능의 차이점

Microsoft 의이 설명서 를 읽은 분

실행 가능한 코드를 포함하는 멤버는 집합 적으로 클래스의 함수 멤버로 알려져 있습니다. 앞 절에서는 함수 멤버의 기본 종류 인 메서드를 설명합니다. 이 단원에서는 C #에서 지원하는 다른 종류의 함수 멤버 인 생성자, 속성, 인덱서, 이벤트, 연산자 및 종료 자에 대해 설명합니다.

따라서 메서드는 함수의 하위 집합입니다. 모든 메서드는 함수이지만 모든 함수가 메서드는 아닙니다. 예를 들어 constructor메서드 라고 말할 수는 없지만 함수입니다.

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


1 차 근사법에서, (C ++ 스타일 OO에서) 메소드는 멤버 함수에 대한 또 다른 단어입니다. 즉, 클래스의 일부인 함수입니다.

C / C ++ 같은 언어에서는 클래스의 멤버가 아닌 함수를 가질 수 있습니다. 당신은 클래스와 연관되지 않은 함수를 메소드라고 부르지 않는다.


IMHO 사람들은 프로그래머가 객체 내부의 함수를 참조하고자 할 때 의사 소통을 쉽게하기 위해 새로운 단어를 발명하기를 원했습니다.

방법을 말하는 경우에는 클래스 내부의 기능을 의미합니다. 함수를 말하면 단순히 클래스 외부에서 작동한다는 것을 의미합니다.

사실은 두 단어 모두 기능을 설명하는 데 사용된다는 것입니다. 잘못 사용한 경우에도 잘못된 것은 없습니다. 두 단어 모두 코드에서 성취하고자하는 바를 잘 설명합니다.

함수는 무언가를하는 역할 ( 함수 )을 수행해야하는 코드입니다. 방법은 문제를 해결하는 방법입니다.

그것은 똑같은 일을합니다. 그것은 같은 것입니다. 당신이 매우 정밀하고 대회와 함께 가고 싶다면 당신은 객체 내부의 함수로서 메소드를 호출 할 수 있습니다.


OO 세계에서, 두 사람은 일반적으로 같은 것을 의미하는 데 사용됩니다.

순수 수학 및 CS 관점에서 함수는 동일한 인수 (f (x, y) = (x + y))로 호출 될 때 항상 동일한 결과를 반환합니다. 한편, 메소드는 일반적으로 클래스의 인스턴스와 연관됩니다. 다시 말하지만, 대부분의 현대 OO 언어는 더 이상 "함수"라는 용어를 대부분 사용하지 않습니다. 많은 정적 메서드는 일반적으로 상태가 없으므로 함수와 매우 유사 할 수 있습니다 (항상 사실은 아님).


나는 다른 많은 사람들이 이미 대답했다는 것을 알고 있지만, 다음은 단순하면서도 효과적인 한 줄 대답이라는 것을 알게되었습니다. 다른 사람들보다 더 잘 보이지 않지만 여기를 읽으십시오. 그러나주의 깊게 읽으면, 메소드와 함수에 대해 알아야 할 모든 것이 있습니다.

메소드는 OOP 용어로 정의 된 수신자가있는 함수이며, 메소드는 오브젝트의 인스턴스에 대한 함수입니다.


나는 전문가는 아니지만 이것이 내가 아는 바이다.

  1. 함수는 C 언어 용어이며, 코드의 일부분을 가리키며 함수 이름은이 함수를 사용하기위한 식별자가됩니다.

  2. 메소드는 OO 용어이며, 일반적으로 함수 매개 변수에 this 포인터가 있습니다. C와 같은이 코드를 호출 할 수 없다. 객체를 호출해야한다.

  3. 호출 메소드도 다릅니다. 여기에이 코드 조각의 주소를 찾는 의미가 있습니다. C / C ++에서 연결 시간은 함수 기호를 사용하여 찾습니다.

  4. Objecive-C는 다릅니다. Invoke는 데이터 구조를 사용하여 주소를 찾는 C 함수를 의미합니다. 그것은 모든 것이 런타임에 알려짐을 의미합니다.


내 이해에서 방법은 클래스에서 수행 할 수있는 모든 작업입니다. 프로그래밍에서 사용되는 일반적인 용어입니다.

많은 언어에서 메소드는 함수와 서브 루틴으로 표현됩니다. 대부분의 언어가 이들에 사용하는 주된 차이점은 함수가 호출자에게 값을 반환 할 수 있고 서브 루틴이 반환하지 않을 수 있다는 것입니다. 그러나 많은 현대 언어는 함수 만 가질 수 있지만 선택적으로 값을 반환 할 수는 없습니다.

예를 들어, 고양이를 묘사하고 싶다고 말하면 하품을 할 수 있습니다. Cat 클래스를 만들려면 Yawn 메서드를 사용합니다. 반환 값이없는 함수 일 가능성이 큽니다.


다음은 JavaScript 예제를 사용하여 메소드 대 함수에 대한 설명입니다.

test(20, 50); 함수 정의 및 일부 단계를 실행하거나 어딘가에 저장 / 사용할 수있는 무언가를 반환하는 데 사용됩니다.

코드 재사용 : 코드를 한 번 정의하고 여러 번 사용할 수 있습니다.

서로 다른 인수를 사용하여 동일한 코드를 여러 번 사용하여 다른 결과를 얻을 수 있습니다.

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); 여기 test ()는 어떤 오브젝트 나 커스텀 메소드의 메소드가 될 수있다. 여기에 inbuilt 오브젝트에 대한 프로토 타입이 정의되어있다.

JavaScript 메소드는 객체에서 수행 할 수있는 작업입니다.

JavaScript 메소드는 함수 정의를 포함하는 속성입니다.

내장 자바 스크립트에서 문자열에 대한 속성 / 메소드 :

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

사용자 정의 예 :

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

문자열, 배열 등의 속성을 정의 할 수 있습니다 (예 :

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

몇 가지 참고 문헌 : Javascript Object Method , Functions , 프로토 타입에 대한 추가 정보


메소드는 클래스의 함수입니다. 정상적인 전문 용어에서는 사람들이 방법과 기능을 모두 교환합니다. 기본적으로 당신은 그것들을 똑같은 것으로 생각할 수 있습니다 (글로벌 함수가 메쏘드라고 불리는 지 확실하지 않습니다).

http://en.wikipedia.org/wiki/Method_(computer_science)


아주 간단한 대답이어야하는 것을 복잡하게하지 맙시다. 메소드와 함수는 같은 것이다. 함수는 클래스 외부에있을 때 함수를 호출하고 클래스 내부에 쓰면 함수를 메서드라고 부릅니다.


역사적으로, "방법"은 가치를 반환하지 않는 것이고 "기능"은 미묘한 차이가있을 수도 있습니다. 각각의 언어는 특별한 의미를 지닌 용어사전을 가지고 있습니다.

"C" 에서 "function" 이란 단어 는 프로그램 루틴을 의미 합니다 .

Java 에서 "함수" 라는 용어는 특별한 의미가 없습니다. "method" 는 클래스의 구현을 형성하는 루틴 중 하나를 의미합니다.

C # 에서는 다음과 같이 번역됩니다.

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

그러나 실제로, 나는 2 가지 개념에서 실제로 차이가 없다는 것을 반복한다. Java에 관한 비공식 토론에서 "함수"라는 용어를 사용하면 사람들은 "방법"을 의미한다고 가정하고 계속 수행 할 것입니다. Java에 대한 적절한 문서 나 프레젠테이션에 사용하지 마십시오. 바보처럼 보일 것입니다.


오브젝트 파스칼 또는 C ++와 같은 객체 지향 언어에서 "메소드"는 객체와 연관된 함수입니다. 예를 들어, "Dog"객체는 "bark"함수를 가질 수 있으며 이것은 "Method"로 간주됩니다. 반대로 "StrLen"함수는 단독으로 사용됩니다 (인수로 제공된 문자열의 길이를 제공합니다). 따라서 그것은 단지 "기능"입니다. Javascript는 기술적으로 Object Oriented이지만 C ++, C # 또는 Pascal과 같은 본격적인 언어와 비교할 때 많은 제약이 있습니다. 그럼에도 불구하고 그 구별은 여전히 ​​유지되어야한다.

몇 가지 추가 사실 : C #은 완전히 객체 지향적이므로 독립형 "함수"를 만들 수 없습니다. C #에서 모든 함수는 객체에 바인딩되어 기술적으로 "메소드"입니다. C #을 사용하는 소수의 사람들은 "메소드"라고 언급 한 사람이 거의 없습니다. 실제로 "함수"라는 용어는 실제 구분이 ​​이루어지지 않기 때문에 "함수"라는 용어 만 사용합니다.

마침내 - 모든 파스칼 전문가들은 여기에 뛰어 들지 않습니다. 파스칼은 또한 "함수"(값을 반환 함)와 그렇지 않은 "절차"를 구별합니다. C #에서는 명시 적으로이 구별을하지 않지만 값을 반환할지 여부는 선택할 수 있습니다.


클래스의 메소드는 객체라고하는 클래스의 인스턴스에 대해 작동합니다.

class Example
{
   public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".

   public void UpdateData() // .. and manipulates it (This is a method by the way)
   {
      data = data + 1;
   }

   public void PrintData() // This is also a method
   {
      Console.WriteLine(data);
   }
}

class Program
{
   public static void Main()
   {
       Example exampleObject1 = new Example();
       Example exampleObject2 = new Example();

       exampleObject1.UpdateData();
       exampleObject1.UpdateData();

       exampleObject2.UpdateData();

       exampleObject1.PrintData(); // Prints "2"
       exampleObject2.PrintData(); // Prints "1"
   }
}

파이썬에 대해 언급 한 이후, 다음은 가장 현대적인 객체 지향 언어에서 메소드와 객체 간의 관계에 대한 유용한 예입니다. 간단히 말해서 "메소드"라고 부르는 것은 (다른 답변에서 지적한 것처럼) 추가 인수가 전달되는 함수 일 뿐이지 만 파이썬은 대부분의 언어보다 더 명시 적으로 만듭니다.

# perfectly normal function
def hello(greetee):
  print "Hello", greetee

# generalise a bit (still a function though)
def greet(greeting, greetee):
  print greeting, greetee

# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
  print greeter.greeting, greetee

# very simple class we can pass to greet_with_greeter
class Greeter(object):
  def __init__(self, greeting):
    self.greeting = greeting

  # while we're at it, here's a method that uses self.greeting...
  def greet(self, greetee):
    print self.greeting, greetee

# save an object of class Greeter for later
hello_greeter = Greeter("Hello")

# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")

이제 greet_with_greeter 함수와 greet 메서드를 비교해 greet_with_greeter : 유일한 차이점은 첫 번째 매개 변수의 이름입니다 ( "greeter"라고하는 함수에서 "self"라고 함). greet_with_greeter 함수를 사용하는 것과 똑같은 방식으로 greet 메서드를 사용할 수 있습니다 (클래스 내에서 정의 했으므로 "점"구문을 사용하여 얻을 수 있습니다).

Greeter.greet(hello_greeter, "World")

그래서 효과적으로 메서드를 함수로 변환했습니다. 함수를 메서드로 변환 할 수 있습니까? 글쎄, 파이썬은 정의 된 클래스를 엉망으로 만든다. 다음과 같이 해보자.

Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")

예, greet_with_greeter 함수는 이제 greet2 메소드 greet2 합니다. 이는 메소드와 함수의 유일한 차이점을 보여줍니다. object.method(args) 를 호출하여 객체를 "on"하는 메서드를 호출하면 언어가 마술처럼 그것을 method(object, args) 합니다.

(OO 순수 주의자는 메서드가 함수와 다른 것이라고 주장 할 수 있으며 고급 Python이나 Ruby 또는 Smalltalk!를 사용하면 자신의 요점을 알기 시작할 것입니다. 또한 일부 언어는 메서드에서 객체의 비트에 대한 특수 액세스를 제공하지만 주요 개념상의 차이점은 여전히 ​​숨겨진 추가 매개 변수입니다.)


함수가 어떤 인수를 받고 결과를 반환 할 수있는 코드 블록 (일반적으로 자체 범위가 있고 때로는 자체 클로저가있는 코드 블록)이라고 가정 해 보겠습니다.

메소드는 객체가 소유하는 함수입니다 (일부 객체 지향 시스템에서는 클래스가 소유하고 있다고 말하는 것이 더 정확합니다). 객체 / 클래스가 "소유"한다는 것은 객체 / 클래스를 통해 메소드를 참조한다는 것을 의미합니다. 예를 들어 Java에서 "door"객체가 소유하는 "open ()"메소드를 호출하려면 "door.open ()"을 작성해야합니다.

일반적으로 메소드는 객체 / 클래스 내에서의 동작을 설명하는 몇 가지 추가 속성도 얻습니다. 예를 들어 객체 (또는 클래스)에서 메소드를 호출 할 수 있는지 정의하는 가시성 (객체 지향 개념의 캡슐화와 관련됨)

많은 객체 지향 언어에서 모든 "함수"는 일부 객체 (또는 클래스)에 속하므로 이러한 언어에서는 메소드가 아닌 함수가 없습니다.


함수는 데이터를 조작하는 데 사용할 수있는 논리 집합입니다. 반면 Method는 속한 개체의 데이터를 조작하는 데 사용되는 함수입니다. 그래서 기술적으로 클래스와 완전히 관련이 없지만 클래스에서 선언 된 함수가있는 경우 메소드가 아닙니다. 그것은 나쁜 디자인이라고 불립니다.


함수는 수학적 개념입니다. 예 :

f(x,y) = sin(x) + cos(y)

함수 f ()는 두 번째 매개 변수의 코사인에 추가 된 첫 번째 매개 변수의 죄를 반환합니다. 그것은 단지 수학입니다. 일어날 때 sin ()과 cos ()도 함수입니다. 함수에는 또 다른 속성이 있습니다. 즉, 동일한 매개 변수를 가진 함수에 대한 모든 호출은 동일한 결과를 반환해야합니다.

한편, 메소드는 객체 지향 언어로 된 객체와 관련된 함수입니다. 하나의 암시 적 매개 변수가 있습니다. 즉, 실행중인 개체 (및 상태)입니다.

따라서 g (x)라는 메서드를 가진 Z 객체가 있다면 다음과 같은 것을 볼 수 있습니다 :

Z.g(x) = sin(x) + cos(Z.y)

이 경우 앞의 함수 예제에서와 같이 매개 변수 x가 전달됩니다. 그러나 cos ()에 대한 매개 변수는 객체 Z 내부에있는 값입니다. Z와 그 내부에있는 데이터 (Zy)는 Z의 g () 메서드에 대한 암시 적 매개 변수입니다.


함수는 주로 프로 시저 지향 프로그래밍에 속하는 개념입니다. 여기서 함수는 데이터를 처리하고 값을 반환 할 수있는 엔터티입니다.

메소드는 메소드가 클래스 멤버에서 대부분 처리하는 클래스의 멤버 인 객체 지향 프로그래밍 의 개념입니다.


함수 는 이름으로 불리는 코드 조각입니다. 그것은 작동 할 데이터 (즉, 매개 변수)를 전달할 수 있으며 선택적으로 데이터 (반환 값)를 반환 할 수 있습니다. 함수에 전달 된 모든 데이터는 명시 적으로 전달됩니다.

메서드 는 객체와 연결된 이름에 의해 호출되는 코드 조각입니다. 대부분의 측면에서 두 가지 주요 차이점을 제외하고는 기능과 동일합니다.

  1. 메서드는 호출 된 개체에 암시 적으로 전달됩니다.
  2. 메소드는 클래스 내에 포함 된 데이터를 조작 할 수 있습니다 (객체는 클래스의 인스턴스입니다. 클래스는 정의이며, 객체는 해당 데이터의 인스턴스입니다).

(이것은 간략한 설명으로 scope 문제를 무시함)


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

함수는 클래스 외부에서 정의되며 메소드는 클래스 내부와 클래스의 일부로 정의됩니다.





terminology