2010-04-25 3 views
2

Java의 연산자와 메서드의 평가 규칙은 어떻게 다릅니 까?운영자와 방법의 차이점은 무엇입니까?

+8

귀하의 질문은 C 또는 Java에서 의미가 없습니다. –

+0

연산자 오버로딩을 허용하는 언어가 많이 있습니다 (메서드 나 함수 또는 호출과 함께). C 나 Java도 그중 하나도 아닙니다. 예를 들어 C++과 Python이 있습니다. – extraneon

+0

@Greg : Java에서 연산자와 메소드가 어떻게 평가되는지 알고 싶습니다. – unj2

답변

1

Femaref의 대답은 꽤 좋습니다. 나는 그것을 확장하고 싶다.

운영자는 (일반적으로) 언어로 하드 와이어된다 : 물건을 +, -, */처럼 일반적으로 직접 기계 언어로 컴파일러에 의해 번역 할 필요없이 (즉, 해당 언어 시스템의 기본 메커니즘 인 경우) 명시 적으로 라이브러리의 메서드를 호출합니다. 이것은 C에서와 같은 방식입니다. 해당 연산자가 언어로 정의되지 않은 경우 2 + 2 대신 plus(2,2)을 코딩해야합니다.

언어로 정의 된 연산자에는 기본 제공되는 우선 순위가 있습니다. */은 일반적으로 +-보다 우선 순위가 높으므로 3 * 3 + 4 * 4으로 작성하고 이러한 우선 순위 나 다른 우선 순위없이 얻을 수있는 것은 52 개가 아니라 52 개 또는 84 개가 될 수 있습니다.

연산자는 컴파일러에서 인식되지만 여전히 라이브러리에 위임 된 경우 약간 회색이됩니다. FORTRAN의 복잡한 숫자가 그 예가 될 수 있습니다. 종종 컴파일러는 복잡한 작업을 기계 코드로 직접 컴파일하는 것을 괴롭히지 않지만 라이브러리를 호출하는 기계 코드를 생성합니다.

대부분의 사람들은 +, -과 같은 산술 연산자만을 생각합니다. 그러나 배열 인덱싱을위한 대괄호 (예 : [ ])를 연산자로 사용할 수도 있습니다.

일부 언어에서는 연산자를 오버로드 할 수 있으므로 연산자가 정상적으로 수행하는 작업을 메서드 호출로 대체 할 수 있습니다.

대부분의 언어에서는 내장 된 메커니즘과 동일한 메커니즘을 지원하는 고유 한 연산자를 정의 할 수 없습니다. Scala는 예외입니다. 원하는 경우 +++ 연산자를 정의하고 제공하는 메소드에 연결하십시오. 어떤 사람들은 연산자 오버로딩이 코드를 이해하기 어렵게 만든다고 생각하기 때문에 배심원 단은 이것이 좋은 아이디어인지에 관해서는 여전히 외면하고 있습니다.

3

운영자

static Foo Plus (Foo right, Foo left) 
{ 
    // do stuff 
    return output; 
} 

에 대한 문법적으로 볼 수는 right + left 대신 Class.Plus(right, left)를 작성하는 단지 더 convinient이다.

+1

C 또는 Java가 아닙니다. – SLaks

0

C와 Java 모두에서 클래스에 '+'연산자를 재정의 할 수 없으므로 다른 언어에 대한 질문에 의미가 있습니다.

연산자가 C++ 및 Python과 같이 재정의 될 수있는 언어가 있습니다. 그러한 비교에 관심이 있다면 왜 시도하지 않겠습니까? 당신의 테스트조차도 '+'연산자가 .add() 메소드보다 느리고 빠르다는 것을 보여줍니다. 이것은 컴파일러 나 환경을 변경하면 바뀔 수 있습니다.

나는 당신이 좋아 보이는 것을 사용해야한다고 생각합니다.

자바의 조언이 StringStringBuffer 대신 운영자 +의를 사용할 수 있었다하지만, 최신의 자바 구현은 + 운영자 더 나은 optimalization을, 그래서이 조언은 새로운 코드에 대한 좋은하지 않습니다.

0

나는 당신이 묻고있는 것과는 다른 추측을 할 것입니다. 당신은 예를 들어, 요구 될 수있다, 순서대로 bar()baz()에 대한 자바 보증은 다음과 같은 두 가지 경우에 실행되는 것을 : 두 경우 모두

foo.bar() + foo.baz() 
fee(foo.bar(), foo.baz()) 

, bar()은 확실히 (baz() 전에 JLS 15.7.1라고 4)

관련 문제