Java Language
표현식
수색…
소개
비고
표현식에서 사용할 수있는 연산자에 대한 참조를 들어, 참조 연산자 .
운영자 우선 순위
표현식에 여러 연산자가 포함되어 있으면 여러 가지 방법으로 읽을 수 있습니다. 예를 들어, 수학 식 1 + 2 x 3
은 두 가지 방법으로 읽을 수 있습니다.
-
1
과2
를 더하고 그 결과에3
곱하십시오. 답은9
입니다. 괄호를 추가하면( 1 + 2 ) x 3
처럼 보일 것입니다. -
2
와3
을 곱한 결과에1
을 더합니다. 이 대답 제공7
. 괄호를 추가하면1 + ( 2 x 3 )
처럼 보일 것입니다.
수학에서 관례는 표현을 두 번째 방법으로 읽는 것입니다. 일반적으로 곱셈과 나눗셈은 더하기와 빼기 전에 수행됩니다. 보다 진보 된 수학 표기법이 사용되면 의미는 "자명하다"(훈련 된 수학자에게!) 또는 괄호가 추가되어 명확성이 확보됩니다. 두 경우 모두 의미를 전달하는 표기법의 효과는 지능과 수학자의 지식에 달려 있습니다.
Java는 사용 된 연산자의 우선 순위 에 따라 표현식을 읽는 방법에 대한 동일한 명확한 규칙을가집니다.
일반적으로 각 연산자는 우선 순위 값으로 간주됩니다. 아래 표를 참조하십시오.
예 :
1 + 2 * 3
+
의 우선 순위는 *
의 우선 순위보다 낮으므로 식의 결과는 9가 아닌 7입니다.
기술 | 연산자 / 구문 (기본) | 상위 | 연관성 |
---|---|---|---|
한정어 괄호 인스턴스 생성 필드 액세스 배열 액세스 메소드 호출 메소드 참조 | 이름 . 이름 ( expr ) new 기본 . 이름 기본 [ expr ] 기본 ( expr, ... ) 기본 :: 이름 | 15 명 | 왼쪽에서 오른쪽으로 |
게시물 증가 | expr ++ , expr -- | 14 | - |
사전 증가 단항 캐스트 1 | ++ expr, -- expr, + EXPR, - EXPR, ~ EXPR, ! expr, ( 형식 ) expr | 13 | - 오른쪽에서 왼쪽으로 오른쪽에서 왼쪽으로 |
Multiplicative | * / % | 12 | 왼쪽에서 오른쪽으로 |
첨가물 | + - | 11 | 왼쪽에서 오른쪽으로 |
시프트 | << >> >>> | 10 | 왼쪽에서 오른쪽으로 |
관계형 | <> <=> = instanceof | 9 | 왼쪽에서 오른쪽으로 |
평등 | ==! = | 8 | 왼쪽에서 오른쪽으로 |
비트 AND | & | 7 | 왼쪽에서 오른쪽으로 |
비트 배타적 논리합 | ^ | 6 | 왼쪽에서 오른쪽으로 |
비트 단위 OR | | | 5 | 왼쪽에서 오른쪽으로 |
논리적 AND | && | 4 | 왼쪽에서 오른쪽으로 |
논리 OR | || | 삼 | 왼쪽에서 오른쪽으로 |
조건부 1 | ? : | 2 | 오른쪽에서 왼쪽으로 |
할당 람다 1 | = = = = = = = = = = = << = >> = >>> = & = ^ = = = -> | 1 | 오른쪽에서 왼쪽으로 |
1 람다 표현 우선 순위는 복소수입니다. 이는 캐스트 이후 나 조건부 삼항 연산자의 세 번째 부분으로 발생할 수도 있기 때문입니다.
상수 표현식
상수 표현식은 기본 유형 또는 문자열을 산출하는 표현식이며 컴파일 타임에 값이 리터럴로 평가 될 수있는 표현식입니다. 표현식은 예외를 발생시키지 않고 평가되어야하며 다음과 같이 구성되어야합니다.
기본 및 문자열 리터럴.
원시 형 또는
String
캐스트를 입력합니다.다음 단항 연산자 :
+
,-
,~
및!
.*
,/
,%
,+
,-
,<<
>>
,>>>
,<
,<=
,>
,>=
,==
!=
,&
,^
,|
,&&
및||
.삼항 조건 연산자
?
:
.괄호 속의 상수 표현.
상수 변수를 참조하는 단순한 이름. (상수 변수는
final
로 선언 된 변수이며 이니셜 라이저 식은 그 자체가 상수 식입니다.)<TypeName> . <Identifier>
형식의 정규화 된 이름입니다<TypeName> . <Identifier>
는 상수 변수를 나타냅니다.
위의 목록 에는 ++
및 --
, 대입 연산자, class
및 instanceof
, 메서드 호출 및 일반 변수 또는 필드에 대한 참조가 제외됩니다.
String
유형의 상수 표현식은 "interned" String
을 생성하고 상수 표현식의 부동 소수점 연산은 FP 엄격한 의미 체계로 평가됩니다.
상수 표현식에 대한 사용
상수 표현식은 일반 표현식을 사용할 수있는 곳이면 어디에서나 사용할 수 있습니다. 그러나 이들은 다음과 같은 맥락에서 특별한 의미가 있습니다.
상수 표현식은 switch 문의 case 레이블에 필요합니다. 예 :
switch (someValue) {
case 1 + 1: // OK
case Math.min(2, 3): // Error - not a constant expression
doSomething();
}
할당의 오른쪽에있는 표현식이 상수 표현식이면 할당은 원시적 인 축소 변환을 수행 할 수 있습니다. 이는 상수 표현식의 값이 왼쪽에있는 유형의 범위 내에 있으면 허용됩니다. ( JLS 5.1.3 및 5.2 참조) 예 :
byte b1 = 1 + 1; // OK - primitive narrowing conversion.
byte b2 = 127 + 1; // Error - out of range
byte b3 = b1 + 1; // Error - not a constant expession
byte b4 = (byte) (b1 + 1); // OK
상수 표현식이 do
, while
또는 for
의 조건으로 사용되면 가독성 분석에 영향을줍니다. 예 :
while (false) {
doSomething(); // Error - statenent not reachable
}
boolean flag = false;
while (flag) {
doSomething(); // OK
}
(이 적용되지 않습니다 if
문. 자바 컴파일러가 허용 then
또는 else
의 블록을 if
문이 도달 할 수. 이것은 C와 C ++에서 조건부 컴파일의 자바 아날로그입니다.)
마지막으로, 상수 표현식 초기화 기가있는 클래스 또는 인터페이스의 static final
필드는 열정적으로 초기화됩니다. 따라서 클래스 초기화 종속성 그래프에주기가있는 경우에도 초기화 된 상태에서 이러한 상수가 관찰됩니다.
더 자세한 정보는 JLS 15.28을 참고하십시오 . 상수 표현 .
식 평가 순서
Java 표현식은 다음 규칙에 따라 평가됩니다.
- 피연산자는 왼쪽에서 오른쪽으로 평가됩니다.
- 연산자의 피연산자는 연산자보다 먼저 평가됩니다.
- 연산자는 연산자 우선 순위에 따라 평가됩니다.
- 인수 목록은 왼쪽에서 오른쪽으로 평가됩니다.
간단한 예
다음 예제에서 :
int i = method1() + method2();
평가 순서는 다음과 같습니다.
-
=
연산자의 왼쪽 피연산자는i
의 주소로 계산됩니다. -
+
연산자 (method1()
)의 왼쪽 피연산자가 계산됩니다. -
+
연산자 (method2()
)의 오른쪽 피연산자가 계산됩니다. -
+
연산이 평가됩니다. -
=
연산은i
덧셈 결과를 대입하여 평가됩니다.
호출의 효과를 관찰 할 수있는 경우 method2
호출 전에 method1
호출이 발생하는 것을 관찰 할 수 있습니다.
부작용이있는 연산자를 사용한 예
다음 예제에서 :
int i = 1;
intArray[i] = ++i + 1;
평가 순서는 다음과 같습니다.
-
=
연산자의 왼쪽 피연산자가 계산됩니다. 이것은intArray[1]
의 주소를 제공합니다. - 사전 증가가 평가됩니다. 이 추가
1
에i
및 평가2
. -
+
의 오른쪽 피연산자가 계산됩니다. -
+
연산은2 + 1
->3
평가됩니다. -
=
연산은 평가되어3
을intArray[1]
할당합니다.
=
의 왼쪽 피연산자가 먼저 평가되므로 ++i
하위 표현의 부작용에 영향을받지 않습니다.
참고:
표현식 기본 사항
Java의 표현식은 계산을 수행하기위한 기본 구성입니다. 여기 예시들이 있습니다 :
1 // A simple literal is an expression
1 + 2 // A simple expression that adds two numbers
(i + j) / k // An expression with multiple operations
(flag) ? c : d // An expression using the "conditional" operator
(String) s // A type-cast is an expression
obj.test() // A method call is an expression
new Object() // Creation of an object is an expression
new int[] // Creation of an object is an expression
일반적으로 표현식은 다음과 같은 형식으로 구성됩니다.
- 다음으로 구성되는 표현식 이름 :
- 간단한 식별자. 예 :
someIdentifier
- 한정된 식별자; 예 :
MyClass.someField
- 간단한 식별자. 예 :
- 다음으로 구성되는 원재료 :
- 리터럴; 예 :
1
,1.0
,'X'
,"hello"
,false
및null
- 클래스 리터럴 식; 예 :
MyClass.class
-
this
과<TypeName> . this
- 괄호 안의 표현; 예 :
( a + b )
- 클래스 인스턴스 생성 식; 예 :
new MyClass(1, 2, 3)
- 배열 인스턴스 생성 식; 예 :
new int[3]
- 필드 접근 식; 예 :
obj.someField
또는this.someField
- 배열 접근 식; 예 :
vector[21]
- 메소드 호출; 예 :
obj.doIt(1, 2, 3)
- 메소드 참조 (Java 8 이상). 예 :
MyClass::doIt
- 리터럴; 예 :
- 단항 연산자 식; 예 :
!a
또는i++
- 이진 연산자 식; 예를 들어
a + b
또는obj == null
- 삼항 연산자 식; 예
(obj == null) ? 1 : obj.getCount()
- 람다 식 (Java 8 이상); 예 :
obj -> obj.getCount()
표현의 다양한 형태의 세부 사항은 다른 주제에서 찾을 수 있습니다.
- 연산자 주제는 단항, 2 진 및 3 항 연산자 표현을 다룹니다.
- 람다 식 주제는 람다 식과 메서드 참조 식을 다룹니다.
- 클래스 및 객체 항목에서는 클래스 인스턴스 작성 표현을 다룹니다.
- 배열 항목에서는 배열 액세스 표현식과 배열 인스턴스 작성 표현식에 대해 설명합니다.
- Literals 주제는 다양한 종류의 리터럴 표현식을 다룹니다.
표현식의 유형
대부분의 경우, 표현식은 정적 유형을 가지고 있습니다. 정적 유형은 컴파일 타임에 그 서브 표현식을 조사하여 판별 할 수 있습니다. 이를 독립형 표현식이라고합니다.
그러나 (Java 8 이상에서) 다음 종류의 표현식은 폴리 표현식 일 수 있습니다.
- 괄호 안의 표현
- 클래스 인스턴스 생성 식
- 메서드 호출 식
- 메서드 참조 식
- 조건식
- 람다 식
표현식이 폴리 표현식 일 때, 표현식의 목표 유형에 의해 그 유형이 영향을받을 수 있습니다. 즉 그것이 무엇을 위해 사용되고 있는지.
표현식의 값
표현식의 값은 해당 유형과 할당이 호환됩니다. 예외는 heap 오염 이 발생한 경우입니다. 예를 들어 "안전하지 않은 변환"경고가 (부적절하게) 억제되거나 무시 되었기 때문입니다.
표현식 문
다른 많은 언어와 달리 Java는 일반적으로 식을 명령문으로 사용할 수 없습니다. 예 :
public void compute(int i, int j) {
i + j; // ERROR
}
표현식을 평가 한 결과는 유용 할 수 없으며 다른 방식으로 프로그램 실행에 영향을 줄 수 없기 때문에 Java 설계자는 이러한 사용이 실수이거나 잘못 인도되었다는 입장을 취했습니다.
그러나 모든 표현식에 적용되는 것은 아닙니다. 표현식의 서브 세트는 진술로서 합법적입니다. 세트는 다음과 같이 구성됩니다.
- 할당 및 연산 할당을 포함한 할당 식.
- 증가 및 감소 표현을 사전 및 사후에 표시합니다.
- 메소드 호출 (
void
또는 비void
). - 클래스 인스턴스 작성 표현식.