Java의 연산자와 메서드의 평가 규칙은 어떻게 다릅니 까?운영자와 방법의 차이점은 무엇입니까?
답변
Femaref의 대답은 꽤 좋습니다. 나는 그것을 확장하고 싶다.
운영자는 (일반적으로) 언어로 하드 와이어된다 : 물건을 +
, -
, *
및 /
처럼 일반적으로 직접 기계 언어로 컴파일러에 의해 번역 할 필요없이 (즉, 해당 언어 시스템의 기본 메커니즘 인 경우) 명시 적으로 라이브러리의 메서드를 호출합니다. 이것은 C에서와 같은 방식입니다. 해당 연산자가 언어로 정의되지 않은 경우 2 + 2
대신 plus(2,2)
을 코딩해야합니다.
언어로 정의 된 연산자에는 기본 제공되는 우선 순위가 있습니다. *
및 /
은 일반적으로 +
및 -
보다 우선 순위가 높으므로 3 * 3 + 4 * 4
으로 작성하고 이러한 우선 순위 나 다른 우선 순위없이 얻을 수있는 것은 52 개가 아니라 52 개 또는 84 개가 될 수 있습니다.
연산자는 컴파일러에서 인식되지만 여전히 라이브러리에 위임 된 경우 약간 회색이됩니다. FORTRAN의 복잡한 숫자가 그 예가 될 수 있습니다. 종종 컴파일러는 복잡한 작업을 기계 코드로 직접 컴파일하는 것을 괴롭히지 않지만 라이브러리를 호출하는 기계 코드를 생성합니다.
대부분의 사람들은 +
, -
과 같은 산술 연산자만을 생각합니다. 그러나 배열 인덱싱을위한 대괄호 (예 : [ ]
)를 연산자로 사용할 수도 있습니다.
일부 언어에서는 연산자를 오버로드 할 수 있으므로 연산자가 정상적으로 수행하는 작업을 메서드 호출로 대체 할 수 있습니다.
대부분의 언어에서는 내장 된 메커니즘과 동일한 메커니즘을 지원하는 고유 한 연산자를 정의 할 수 없습니다. Scala는 예외입니다. 원하는 경우 +++
연산자를 정의하고 제공하는 메소드에 연결하십시오. 어떤 사람들은 연산자 오버로딩이 코드를 이해하기 어렵게 만든다고 생각하기 때문에 배심원 단은 이것이 좋은 아이디어인지에 관해서는 여전히 외면하고 있습니다.
운영자
static Foo Plus (Foo right, Foo left)
{
// do stuff
return output;
}
에 대한 문법적으로 볼 수는 right + left
대신 Class.Plus(right, left)
를 작성하는 단지 더 convinient이다.
C 또는 Java가 아닙니다. – SLaks
C와 Java 모두에서 클래스에 '+'연산자를 재정의 할 수 없으므로 다른 언어에 대한 질문에 의미가 있습니다.
연산자가 C++ 및 Python과 같이 재정의 될 수있는 언어가 있습니다. 그러한 비교에 관심이 있다면 왜 시도하지 않겠습니까? 당신의 테스트조차도 '+'연산자가 .add() 메소드보다 느리고 빠르다는 것을 보여줍니다. 이것은 컴파일러 나 환경을 변경하면 바뀔 수 있습니다.
나는 당신이 좋아 보이는 것을 사용해야한다고 생각합니다.
자바의 조언이 String
와 StringBuffer
대신 운영자 +
의를 사용할 수 있었다하지만, 최신의 자바 구현은 +
운영자 더 나은 optimalization을, 그래서이 조언은 새로운 코드에 대한 좋은하지 않습니다.
나는 당신이 묻고있는 것과는 다른 추측을 할 것입니다. 당신은 예를 들어, 요구 될 수있다, 순서대로 bar()
및 baz()
에 대한 자바 보증은 다음과 같은 두 가지 경우에 실행되는 것을 : 두 경우 모두
foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())
, bar()
은 확실히 (baz()
전에 JLS 15.7.1라고 4)
- 1. 이 초기화 방법의 차이점은 무엇입니까?
- 2. Java : 이러한 구성 방법의 차이점은 무엇입니까
- 3. C에서 문자열을 만드는 방법의 차이점은 무엇입니까?
- 4. 스크럼과 다른 애자일 방법의 차이점은 무엇입니까?
- 5. 양식을 표시하는 다음과 같은 방법의 차이점은 무엇입니까?
- 6. 데이터베이스를 삭제하는 두 가지 방법의 차이점은 무엇입니까?
- 7. Wicket에서 다른 입력 방법의 차이점은 무엇입니까?
- 8. `ToXXXX`와`AsXXXX` 변환 방법의 차이점은 무엇입니까?
- 9. 프리즘에 모듈을로드하는 두 가지 방법의 차이점은 무엇입니까?
- 10. 프로세스를 죽이는 두 가지 방법의 차이점은 무엇입니까?
- 11. find_by_sql과 일반 레일 질의 방법의 차이점은 무엇입니까?
- 12. 운영자와 키워드는 같은가요?
- 13. 동기 (이)와 동기화 방법의 차이점은 무엇
- 14. 스윙 창을 초기화 할 수있는 방법의 차이점은 무엇입니까?
- 15. 자바 스크립트에서 배열을 정의하는 이들 방법의 차이점은 무엇입니까?
- 16. VS2010에서 웹 서비스를 만드는 두 가지 방법의 차이점은 무엇입니까?
- 17. JavaScript에서 함수를 정의하는 두 가지 방법의 차이점은 무엇입니까?
- 18. JSON 객체를 반환하는 두 가지 방법의 차이점은 무엇입니까?
- 19. 이러한 방법과 NULL을 올바르게 검사하는 방법의 차이점은 무엇입니까?
- 20. Python IO 전문가 :이 두 방법의 차이점은 무엇입니까?
- 21. '중복 증가'를 구현하는 두 가지 방법의 차이점은 무엇입니까?
- 22. 이러한 종류의 쿼리 이름과 사용 방법의 차이점은 무엇입니까
- 23. Java에서 이러한 두 가지 캐스팅 방법의 차이점은 무엇입니까?
- 24. 운영자와 액세스 사이
- 25. 운영자와 관련된 문제 코드
- 26. PHP에서 확장을로드하는 방법의 차이점
- 27. 탭 전환 방법의 차이점
- 28. 정적 방법의 단점은 무엇입니까?
- 29. 원자 방법의 용도는 무엇입니까?
- 30. 합성 방법의 정보원은 무엇입니까?
귀하의 질문은 C 또는 Java에서 의미가 없습니다. –
연산자 오버로딩을 허용하는 언어가 많이 있습니다 (메서드 나 함수 또는 호출과 함께). C 나 Java도 그중 하나도 아닙니다. 예를 들어 C++과 Python이 있습니다. – extraneon
@Greg : Java에서 연산자와 메소드가 어떻게 평가되는지 알고 싶습니다. – unj2