IT story

Java에서 연산자 오버로드

hot-time 2020. 5. 26. 07:47
반응형

Java에서 연산자 오버로드


Java로 연산자를 오버로드 할 수 있는지 알려주세요. Java의 어느 곳에서나 사용되는 경우 알려주십시오.


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

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


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

String concat = "one" + "two";

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


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

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


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


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

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


Java Operator Overloading을 시도 할 수 있습니다 . 자체 제한이 있지만 연산자 오버로드를 실제로 사용하려는 경우 시도해 볼 가치가 있습니다.


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

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

가독성에 관하여.
비교:

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

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

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

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

문자열 연결 정보 :

수학자들은 세트에 대한 정류 연산을 위해 symnol +를 사용합니다.
따라서 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 평등과 정체성이 어떻게 혼동되는지 주목하십시오. == (같음) 기호는 다음을 의미
합니다. 기본 유형에 대한 평등
b. 따라서 사용자 정의 형식에 대한 신원 확인을 위해 equals () 함수를 동등 하게 사용해야합니다 .
하지만 ... 연산자 오버로딩과 어떤 관련이 있습니까?
언어가 연산자 오버로드를 허용하는 경우 사용자는 동등 연산자에 올바른 의미를 줄 수 있습니다.


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
    }

}

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


또는 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의 컴파일러 오류입니다.


C ++와 달리 Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다. 오버로드는 java 내부에서 수행되며 ex의 경우 + (plus)를 사용할 수 있습니다. int a = 2 + 4; , string = "hello"+ "world"; 여기에 2 개의 정수를 더하고 2 개의 문자열을 연결합니다. 따라서 Java는 내부 연산자 오버로드를 지원하지만 사용자 정의는 지원하지 않는다고 말할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1686699/operator-overloading-in-java

반응형