누군가 OOP 컨텍스트에서 메소드 와 함수 에 대한 간단한 설명을 제공 할 수 있습니까 ?
if(class(object)) { ... } else {stop()}
개념적으로 메소드와 동일합니까?
누군가 OOP 컨텍스트에서 메소드 와 함수 에 대한 간단한 설명을 제공 할 수 있습니까 ?
if(class(object)) { ... } else {stop()}
개념적으로 메소드와 동일합니까?
답변:
기능은 이름에 의해 호출되는 코드의 조각이다. 작동 할 데이터 (예 : 매개 변수)를 전달하고 선택적으로 데이터 (반환 값)를 리턴 할 수 있습니다. 함수에 전달 된 모든 데이터는 명시 적으로 전달됩니다.
방법은 객체와 연관된 이름으로 호출 코드의 조각이다. 대부분의 경우 두 가지 주요 차이점을 제외하고 함수와 동일합니다.
(이것은 범위 문제 등을 무시하고 단순화 된 설명입니다 .)
메소드가 오브젝트에 있습니다.
함수는 객체와 무관합니다.
Java 및 C #의 경우 메소드 만 있습니다.
C의 경우 기능 만 있습니다.
C ++ 및 Python의 경우 클래스에 있는지 여부에 따라 다릅니다.
'method' 는 'function'에 대한 객체 지향 단어입니다 . 그것은 거의 모든 것입니다 (즉, 실제 차이는 없습니다).
불행히도, 여기에 많은 답변이 복잡하고 의미있는 차이가 있다는 생각을 지속 시키거나 발전시키고 있다고 생각합니다.
실제로-그다지 많지는 않지만 같은 것에 대해 다른 단어가 있습니다.
【늦은 추가】
실제로 Brian Neal 이이 질문 에 대한 의견에서 지적했듯이 C ++ 표준은 멤버 함수를 참조 할 때 '방법'이라는 용어를 사용하지 않습니다. 어떤 사람들은 C ++이 실제로 객체 지향 언어가 아니라는 표시로 받아 들일 수 있습니다. 그러나 나는 꽤 똑똑한 사람들이 다른 용어를 사용해야 할 특별한 이유가 있다고 생각하지 않았다는 것을 나타내는 것으로 선호합니다.
self
주장이 명백하다. 그리고 많은 언어에는 정적 메서드가 있으며 인스턴스에는 전달되지 않습니다.
this
또는 재정의를 지원하는 언어가 self
있지만 이러한 구조는 일반적으로 메서드가 아니라 함수라고합니다.
일반적으로 : 메소드는 클래스에 속하는 함수이며 함수는 코드의 다른 범위에있을 수 있으므로 모든 메소드가 함수이지만 모든 함수가 메소드가 아님을 진술 할 수 있습니다.
다음 파이썬 예제를 보자.
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 클래스도있는 경우 메소드가됩니다. 인간과 개 모두에게 먹이를 줄 수 있기 때문에 어떤 클래스에도 속하지 않는 함수 "피드"를 작성하십시오. 특히 어떤 클래스에도 속하지 않기 때문에 함수를 호출 할 수 있습니다.
기억하는 간단한 방법 :
여기에서 읽고 싶은 느낌이 든다면 "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 예제를 추가하십시오.
함수가 일부 인수를 수신하고 결과를 반환 할 수있는 코드 블록 (일반적으로 자체 범위 및 경우에 따라 자체 폐쇄가있는)이라고 가정 해 봅시다.
메소드는 객체가 소유 한 함수입니다 (일부 객체 지향 시스템에서는 클래스가 소유하고 있다고 말하는 것이 더 정확합니다). 객체 / 클래스가 "소유"한다는 것은 객체 / 클래스를 통해 메소드를 참조한다는 의미입니다. 예를 들어, Java에서 "door"오브젝트가 소유 한 "open ()"메소드를 호출하려면 "door.open ()"을 작성해야합니다.
일반적으로 메소드는 또한 객체 / 클래스 내에서 동작을 설명하는 추가 속성을 얻습니다.
많은 객체 지향 언어에서 모든 "함수"는 일부 객체 (또는 클래스)에 속하므로 이러한 언어에는 메소드가 아닌 함수가 없습니다.
메소드는 클래스의 함수입니다. 일반적인 전문 용어에서 사람들은 방법과 기능을 온전히 교환합니다. 기본적으로 그것들을 같은 것으로 생각할 수 있습니다 (전역 함수가 메소드라고 불릴 지 확실하지 않습니다).
함수는 수학적 개념입니다. 예를 들면 다음과 같습니다.
f(x,y) = sin(x) + cos(y)
함수 f ()는 두 번째 매개 변수의 코사인에 추가 된 첫 번째 매개 변수의 sin을 반환한다고 말합니다. 수학 일뿐입니다. sin ()과 cos ()도 함수입니다. 함수에는 다른 속성이 있습니다. 동일한 매개 변수를 가진 함수를 호출하면 모두 동일한 결과를 반환해야합니다.
한편, 방법은 객체 지향 언어의 객체와 관련된 함수입니다. 여기에는 하나의 암시 적 매개 변수가 있습니다 : 작동중인 오브젝트 (및 상태).
따라서 g (x) 방법을 사용하여 객체 Z가있는 경우 다음을 볼 수 있습니다.
Z.g(x) = sin(x) + cos(Z.y)
이 경우 앞의 함수 예에서와 같이 매개 변수 x가 전달됩니다. 그러나 cos ()에 대한 매개 변수는 개체 Z 내에있는 값입니다. Z와 그 안에있는 데이터 (Zy)는 Z의 g () 메서드에 대한 암시 적 매개 변수입니다.
함수 또는 메서드는 이름이 지정된 호출 가능한 코드로, 일부 작업을 수행하고 선택적으로 값을 반환합니다.
에서는 C의 언어 기능이라는 용어가 사용된다. Java & C # 사람들은 메소드라고 말합니다 (이 경우 함수는 클래스 / 객체 내에 정의됩니다).
C ++ 프로그래머는이 용어를 '방법'이기 때문에, 또한 C / C ++는 단지 프로그래머 가능성이 함수를 호출 할 ++ 절차 스타일의 C ++ 코드를 작성하거나 C의 객체 지향 방법을 수행하는 경우에 따라 함수 나 때때로 방법 (호출 수 C / C ++ 문헌에서 덜 자주 사용됨).
함수는 이름을 다음과 같이 호출하여 사용합니다.
result = mySum(num1, num2);
먼저 객체를 참조하여 메소드를 호출합니다.
result = MyCalc.mySum(num1,num2);
역사적으로는 "방법"값을 반환하지 않는 것을 무언가하고, "기능"does.Each 언어 자체가 하나 미묘한 차이가되었을 수도 용어의 어휘 특별한 의미를.
에서 "C" 단어 "기능" 을 의미 하는 프로그램 루틴을 .
에서 자바 , 용어 "기능은" 특별한 의미가 없습니다. 반면 "방법" 은 클래스의 구현을 구성하는 루틴 중 하나를 의미합니다.
C # 에서는 다음 과 같이 번역됩니다.
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
그러나 실제로 두 개념에는 차이가 없다고 반복합니다. Java에 대한 비공식 토론에서 "기능"이라는 용어를 사용하면 사람들은 "방법"을 의미한다고 가정하고 계속합니다. Java에 관한 적절한 문서 나 프리젠 테이션에 사용하지 마십시오. 어리석게 보일 것입니다.
method
... 또는 내가 부를 것이다 procedure
하고 function
.
함수는 데이터를 조작하는 데 사용할 수있는 일련의 논리입니다.
반면, Method는 객체가 속한 객체의 데이터를 조작하는 데 사용되는 함수입니다. 따라서 기술적으로, 클래스와 완전히 관련이 없지만 클래스에서 선언 된 함수가 있다면 메소드가 아닙니다. 나쁜 디자인이라고합니다.
클래스의 메소드는 객체라고하는 클래스의 인스턴스에서 작동합니다.
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"
}
}
Object Pascal 또는 C ++와 같은 OO 언어에서 "방법"은 객체와 관련된 함수입니다. 예를 들어, "개"개체에는 "나무 껍질"기능이있을 수 있으며 이는 "방법"으로 간주됩니다. 반대로 "StrLen"함수는 독립형입니다 (인수로 제공된 문자열의 길이를 제공함). 따라서 이것은 단지 "기능"입니다. Javascript는 기술적으로 객체 지향적이지만 C ++, C # 또는 Pascal과 같은 완전한 언어와 비교할 때 많은 제한에 직면합니다. 그럼에도 불구하고 구별은 여전히 유효하다.
몇 가지 추가 사실 : C #은 완전히 객체 지향적이므로 독립형 "함수"를 만들 수 없습니다. C #에서 모든 함수는 객체에 바인딩되므로 기술적으로 "메소드"입니다. 키커는 C #에서 소수의 사람들이 "메소드"라고 부르는 것입니다. 실제로 구별 할 것이 없기 때문에 "함수"라는 용어 만 사용합니다.
마지막으로-파스칼 전문가가 나를 여기에 뛰어 넘지 않도록하십시오-파스칼은 또한 "기능"(값을 반환하는)과 그렇지 않은 "프로 시저"를 구별합니다. 물론 C #에서는 값을 반환할지 여부를 선택할 수 있지만이 구분을 명시 적으로 만들지는 않습니다.
파이썬을 언급 했으므로 다음은 가장 현대적인 객체 지향 언어에서 메소드와 객체 간의 관계를 보여주는 유용한 예일 수 있습니다. 간단히 말해서 그들이 "메소드"라고 부르는 것은 다른 인수가 지적한 것처럼 추가 인수를 전달하는 함수 일 뿐이지 만 Python은 대부분의 언어보다 더 명시 적으로 만듭니다.
# 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
사용하는 것과 정확히 같은 방식으로 메소드를 사용할 수 있습니다 greet_with_greeter
(클래스 내부에서 정의 했으므로 "도트"구문을 사용하여 가져옵니다).
Greeter.greet(hello_greeter, "World")
그래서 효과적으로 메소드를 함수로 전환했습니다. 함수를 메소드로 바꿀 수 있습니까? 파이썬이 클래스를 정의한 후에 엉망으로 만들 수 있으므로 시도해 봅시다.
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
예, 기능 greet_with_greeter
은 이제 메소드라고도합니다 greet2
. 이것은 메소드와 함수의 유일한 차이점을 보여줍니다. 메소드를 호출하여 오브젝트를 "on"메소드를 호출 object.method(args)
하면 언어는 마술로로 바뀝니다 method(object, args)
.
(OO 순수 주의자들은 메소드가 함수와 다른 것이라 주장 할 수도 있고, 고급 파이썬이나 루비 또는 스몰 토크에 들어가면 그 포인트를 보게 될 것입니다. 또한 일부 언어는 메소드에 객체의 비트에 대한 특별한 액세스를 제공합니다. 주요 개념 차이는 여전히 숨겨진 추가 매개 변수입니다.)
나를 위해 : 메소드와 함수의 기능은 내가 동의하면 동일합니다.
다른 코드와 마찬가지로 입력 한 객체가있을 수 있으며 결과적으로 생성되는 객체가있을 수 있습니다. 그렇게하는 동안 객체의 상태가 변경 될 수는 있지만 기본 기능은 변경되지 않습니다.
객체 또는 다른 코드의 함수를 호출 할 때 정의에 차이가있을 수 있습니다. 그러나 그것은 언어 적 차별에 대한 것이 아니며 사람들이 그것들을 교환하는 이유입니까? 내가 언급 할 계산의 예를 언급했다. 내가 계산을하기 위해 고용을하기 때문에 :
new Employer().calculateSum( 8, 8 );
그렇게하면 계산을 담당하는 고용주에게 의지 할 수 있습니다. 그가 더 많은 돈을 원한다면 나는 그를 풀어주고 미사용 직원을 처분하는 쓰레기 수거업자의 기능이 나머지를하고 새 직원을 얻도록하자.
메소드가 객체 함수이고 함수가 연결되지 않은 계산이라고 주장하더라도 도움이되지 않습니다. 함수 디스크립터 자체와 이상적으로 함수의 문서는 무엇이 필요하고 무엇이 반환 될 수 있는지 알려줍니다. 일부 객체의 상태를 조작하는 것과 같은 나머지는 실제로 투명하지 않습니다. 나는 기능과 방법 모두 그들이 어떻게하는지에 대해 자세히 알 필요없이 그들이 주장하는 것을 전달하고 조작 할 것으로 기대합니다. 순수한 계산 기능조차도 콘솔의 상태를 변경하거나 로그 파일에 추가 할 수 있습니다.
내 이해에서 메소드는 클래스에서 수행 할 수있는 모든 작업입니다. 프로그래밍에 사용되는 일반적인 용어입니다.
많은 언어에서 메소드는 함수와 서브 루틴으로 표시됩니다. 대부분의 언어에서 이러한 언어를 사용하는 주요 차이점은 함수가 호출자에게 값을 다시 반환 할 수 있고 서브 루틴은 그렇지 않을 수 있다는 것입니다. 그러나 많은 현대 언어에는 함수 만 있지만 선택적으로 값을 반환 할 수는 없습니다.
예를 들어, 고양이를 묘사하고 하품을하고 싶다고 가정 해 봅시다. Yawn 메소드를 사용하여 Cat 클래스를 작성하면 리턴 값이없는 함수일 가능성이 높습니다.
함수는 주로 프로 시저 지향 프로그래밍에 속하는 개념입니다 . 함수는 데이터를 처리하고 값을 리턴 할 수있는 엔티티입니다.
Method는 객체 지향 프로그래밍 의 개념으로 , 메소드는 클래스 멤버를 처리하는 클래스의 멤버입니다.
IMHO 사람들은 프로그래머가 객체 내부의 함수를 참조하려고 할 때 쉽게 의사 소통하기 위해 새로운 단어를 발명하기를 원했습니다.
메서드를 말하는 경우 클래스 내부의 함수를 의미합니다. 함수를 말하는 경우 단순히 클래스 외부의 함수를 의미합니다.
진실은 두 단어가 기능을 설명하는 데 사용된다는 것입니다. 잘못 사용하더라도 아무 일도 일어나지 않습니다. 두 단어 모두 코드에서 달성하고자하는 것을 잘 설명합니다.
함수는 무언가를 하는 역할 ( 함수 )을 수행해야하는 코드입니다. 방법은 방법 이 문제를 해결하기 위해.
같은 일을합니다. 같은 것입니다. 매우 정확하고 규칙을 따르고 싶다면 객체 내부의 함수로 메소드를 호출 할 수 있습니다.
나는 전문가가 아니지만 이것이 내가 아는 것입니다.
함수는 C 언어 용어이며 코드 조각을 나타내며 함수 이름은이 함수를 사용하는 식별자입니다.
방법은 OO 용어이며 일반적으로 함수 매개 변수에 this 포인터가 있습니다. C와 같은이 코드를 호출 할 수 없으므로 객체를 사용하여 호출해야합니다.
호출 메소드도 다릅니다. 여기서이 코드의 주소를 찾기 위해 의미를 호출하십시오. C / C ++에서 연결 시간은 함수 기호를 사용하여 찾습니다.
Objecive-C는 다릅니다. 데이터 구조를 사용하여 주소를 찾으려면 의미 C 함수를 호출하십시오. 런타임에 모든 것이 알려져 있음을 의미합니다.
이 문서 를 Microsoft 에서 읽음
실행 코드가 포함 된 멤버를 통틀어 클래스의 함수 멤버라고합니다. 이전 섹션에서는 함수의 주요 종류 인 메서드에 대해 설명했습니다. 이 섹션에서는 C #에서 지원하는 다른 종류의 함수 멤버 인 생성자, 속성, 인덱서, 이벤트, 연산자 및 종료 자에 대해 설명합니다.
따라서 메소드는 함수의 서브 세트입니다. 모든 메소드는 함수이지만 모든 함수가 메소드 constructor
는 아닙니다. 예를 들어, 메소드 라고 말할 수는 없지만 함수입니다.
함수-일부 논리를 포함하고 독립적으로 호출되어야하며 클래스 외부에서 정의 되어야 하는 독립적 인 코드 조각의 함수입니다 .
메소드-메소드는 일부 오브젝트를 참조하여 호출되며 클래스 내부에서 정의 되는 독립적 인 코드입니다 .
다음은 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 ()는 일부 객체의 메소드이거나 내장 객체에 대한 사용자 정의 프로토 타입을 정의 할 수 있습니다. 자세한 설명은 다음과 같습니다.
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 , prototype에 대한 추가 정보
TL; DR
함수는 실행할 코드입니다.
메소드는 객체 내부의 함수입니다.
함수의 예 :
function sum(){
console.log("sum")l
}
방법의 예 :
const obj = {
a:1,
b:2,
sum(){
}
}
따라서 함수 안에서 "this"키워드를 호출, 적용 또는 바인드와 함께 사용하지 않는 한 그렇게 유용하지 않다고 말하는 이유는 무엇입니까? 함수를 메소드로 변환