Java에서 연산자 오버로드


답변:


235

아니요, Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. "custom"연산자 오버로딩에 근접한 Java의 유일한 측면은 문자열에 대한 + 처리입니다. 이는 상수의 컴파일 타임 연결 또는 StringBuilder / StringBuffer를 사용한 실행 시간 연결을 초래합니다. 같은 방식으로 작동하는 자체 연산자를 정의 할 수 없습니다.

자바처럼 (및 JVM 기반) 언어에 대해 수행 지원 연산자 오버로딩을, 당신은 볼 수 있었다 코 틀린 또는 멋져요 . 또는 Java 컴파일러 플러그인 솔루션으로 운이 좋을 수도 있습니다 .


4
우리는 자바에서 래퍼를 만들 수 없다고 말하고 있습니까? 정수와 같은 SmallInteger와 같은?
huseyin tugrul buyukisik

3
@ tuğrulbüyükışık : 기존의 모든 기본 유형에 대한 래퍼가 이미 있습니다. 그러나 고유 한 새 래퍼 유형을 작성하려는 경우 언어에서 특정 지원을 제공하므로 다른 래퍼 유형과 같이 작동하게 할 수 없습니다.
Jon Skeet

1
고마워, 나는 그것에 대해 구글 검색하고 찾을 수 없습니다. 나는 두 개의 기본 요소 (이중 및 int ---> 정밀도 + 좋은 범위)로 구성된 복잡한 변수를 만들 수 있는지 알고 싶었다
huseyin tugrul buyukisik

40
@djaqeel : 연산자 오버로딩은 잘못 사용될 때 코드를 읽을 수 없게 만듭니다 . 잘 사용하면 가독성 IMO를 크게 향상시킬 수 있습니다. BigIntegerJava에서 사용하는 코드를 본 다음 BigInteger연산자를 사용하여 C #에서 사용 하는 유사한 코드를보십시오 . 대리인이 OOP 원칙을 어기는 방법을 모르겠습니다. 반대 의견보다 훨씬 더 정확해야합니다. Java 디자이너가 다양한 기능을 포함하지 않은 이유에 대한 세부 정보는 알지 못하지만 리소스 압력과 언어를 작고 비교적 단순하게 유지하려는 열망이 혼합되어 있다고 생각합니다.
Jon Skeet

4
나는 이것이 늦었다는 것을 알고 있지만, 그 예는 수천 가지 논쟁의 가치가 있습니다. 감안할 때 m0A와 Matrixv0, v1, v2, v3,와 v4같은 VectorS, 단순히 당신이하는 데 걸리는 시간을 비교 올바르게 다음과 같은 수식을 해석 m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);. 연산자 오버로딩에 대한 지원이 포함되어 있으며로 작성 될 수 m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;있습니다.
code_dredd

38

Java에서 연산자 오버로딩은 문자열 유형의 연결에 사용됩니다.

String concat = "one" + "two";

그러나 고유 한 연산자 오버로드를 정의 할 수 없습니다 .


26

지적 모든 사람들뿐만 아니라 +문자열에 대한 과부하, -또한 모두 부동 소수점 및 정수 작업에 과부하 등이다 *하고 /.

[edit] %또한 부동 소수점에 과부하가 걸리므로 C 또는 C ++ 배경을 가진 사람들에게는 약간 놀라운 일이 될 수 있습니다.


21

Java는 연산자 오버로드를 허용하지 않습니다. 선호되는 접근 방식은 a.add(b)대신 클래스에서 메소드를 정의하여 조치를 수행하는 것입니다 a + b. Java와 같이 C에서 제외 된 다른 비트에 대한 요약은 다음과 같습니다. C 및 C ++에서 제거 된 기능


2
중요한 것은 Java 소스 파일을 컨텍스트 독립적으로 만드는 디자인 목표입니다. 매크로가 많은 C 프로그램은 매우 큰 (MLOC)을 읽으려고 할 때 학습 시간이 매우 길다. 비슷한 (또는 더 큰) Java 프로그램은 작은 Java 프로그램보다 더 깊이 들어가기 어렵지 않습니다. Gosling이 말했듯이 : 블루 칼라 프로그래머가 일할 수있는 언어. [그리고 상용구의 장황함이 해롭다 고 생각하는 사람은 전문가의인지 청크에 대해 읽어야합니다.]
Tim Williscroft

2
오라클 덕분에 java.sun.com 링크는 작동하지 않습니다. 가능한 경우 업데이트 된 링크를 제공 할 수 있습니까?
Syed Aqeel Ashiq

17

Java는 연산자 오버로드를 허용하지 않으므로 직접 수행 할 수 없습니다.

그러나 한 가지 예외가 있습니다. ++ = 는 String 객체에 대해 오버로드됩니다.


8
Java에는 연산자 오버로드에 대한 다른 많은 예가 있습니다. 예를 들어 &, |^과부하 boolean및 정수 유형입니다. 실제로 산술 및 관계 연산자는 다양한 숫자 유형에 대해 오버로드됩니다. (물론, 과부하의 의미론은 훨씬 더 가깝습니다 ...)
Stephen C

16

다른 많은 사람들이 대답했듯이 Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다.

어쩌면 이것은 주제가 아닌 것일 수도 있지만 일부 답변에서 읽은 내용에 대해 언급하고 싶습니다.

가독성에 관하여.
비교:

  1. c = a + b
  2. c = a.add (b)

다시 봐!
어느 것이 더 읽기 쉬운가?

사용자 정의 형식을 만들 수있는 프로그래밍 언어는 내장 형식 (또는 기본 형식)과 같은 방식으로 작동 할 수 있어야합니다.

따라서 Java는 일반 프로그래밍의 기본 원칙을 위반합니다.
내장 유형의 객체를 사용자 정의 유형의 객체와 상호 교환 할 수 있어야합니다.
( '그가'내장 객체 '라고 말했습니까?'라고 궁금해 할 수도 있습니다. 예, 여기를 참조하십시오 .)

문자열 연결 정보 :

수학자들은 기호의 +를 사용하여 집합에 대한 정류 연산을합니다.
따라서 a + b = b + a임을 확신 할 수 있습니다.
문자열 연결 (대부분의 프로그래밍 언어에서)은이 일반적인 수학 표기법을 존중하지 않습니다.

a := "hello";
b := "world";
c := (a + b = b + a);

또는 Java로 :

String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);

추가 :
Java 평등과 정체성이 어떻게 혼동되는지 주목하십시오. == (같음) 기호는 다음을 의미
합니다. 기본 유형의 평등
비. 따라서 사용자 정의 형식에 대한 신원 확인을 위해 equals () 함수를 동등 하게 사용해야합니다 .
하지만 ... 연산자 오버로딩과 어떤 관련이 있습니까?
언어가 연산자 오버로드를 허용하는 경우 사용자는 항등 연산자에 적절한 의미를 부여 할 수 있습니다.


이 기호 ==는 C 및 C ++에서와 같이 Java에서 평등에 사용됩니다. 이것은 연산자 오버로드와 관련이 없습니다.
Hot Licks

2
Java에서 operator ==는 기본 유형에 대해 동일성을 의미합니다. 사용자 정의 유형의 경우 ID를 의미합니다. C ++에서 시맨틱은 사용자가 정의하지만 내장 된 시맨틱, 평등을 유지해야합니다. 문자열 a = "hello"; 문자열 b = "hello"; 부울 c = (a == b);
Fernando Pelliccioni

3
첫 의견에서 말한 내용이 잘못되었습니다. 권리? C에서 사용자 정의 유형에 대해 동등성과 동일성을 테스트하는 방법을 알려주십시오. 당신은 옳습니다. 평등에 대한 나의 의견은 OT이지만, 나는 그것을 명확히했습니다 ( "extras"참조). 프로그래밍 언어를 만들지 않았다고해서 기존 언어를 비판 할 수는 없습니다. 종교적 전쟁으로 비판을 본다면 유감입니다.
Fernando Pelliccioni

1
긴 것을 짧게 말하면 자바는 짜증납니다.
Ivankov


6

Java 코드와 함께 Xtend를 사용하십시오. 연산자 오버로드를 지원합니다.

    package com.example;

@SuppressWarnings("all")
public class Test {
  protected int wrapped;

  public Test(final int value) {
    this.wrapped = value;
  }

  public int operator_plus(final Test e2) {
    return (this.wrapped + e2.wrapped);
  }
}

package com.example

class Test2 {

    new() {
        val t1 = new Test(3)
        val t2 = new Test(5)
        val t3 = t1 + t2
    }

}

공식 웹 사이트에는 각 운영자를 위해 구현할 메소드 목록이 있습니다!


5

또는 Java Groovy를 만들고 이러한 기능을 오버로드하여 원하는 것을 얻을 수 있습니다.

//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...

class Fish {
    def leftShift(Fish fish) {
        print "You just << (left shifted) some fish "
    }
}


def fish = new Fish()
def fish2 = new Fish()

fish << fish2

누가 그루비가되고 싶지 않습니까? :디

아니요 Java에서 컴파일 된 groovy JAR을 동일한 방식으로 사용할 수 없습니다. 여전히 Java의 컴파일러 오류입니다.


1

C ++와 달리 Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. 오버로드는 자바에서 내부적으로 수행됩니다.

+예를 들어 (더하기)를 취할 수 있습니다 .

int a = 2 + 4;
string = "hello" + "world";

여기에 plus는 두 개의 정수를 더하고 두 개의 문자열을 연결합니다. 따라서 Java는 내부 연산자 오버로드를 지원하지만 사용자 정의는 지원하지 않는다고 말할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.