콜론 (:) 연산자는 무엇을합니까?


94

분명히 콜론은 Java에서 여러 가지 방법으로 사용됩니다. 누구든지 그것이 무엇을 설명하는지 설명해 주시겠습니까?

예를 들면 다음과 같습니다.

String cardString = "";
for (PlayingCard c : this.list)  // <--
{
    cardString += c + "\n";
}

for-each루프를 다른 방식으로 작성 하여 :?


4
다른 사람들은 이미 그러한 경우가 for-each 루프라고 언급했습니다. 작동 방식에 대한 자세한 설명은 java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Jonik

답변:


197

Java 코드에서 콜론이 사용되는 여러 위치가 있습니다.

1) 점프 아웃 레이블 ( 튜토리얼 ) :

label: for (int i = 0; i < x; i++) {
    for (int j = 0; j < i; j++) {
        if (something(i, j)) break label; // jumps out of the i loop
    }
} 
// i.e. jumps to here

2) 삼항 조건 ( 튜토리얼 ) :

int a = (b < 4)? 7: 8; // if b < 4, set a to 7, else set a to 8

3) For-each 루프 ( 튜토리얼 ) :

String[] ss = {"hi", "there"}
for (String s: ss) {
    print(s); // output "hi" , and "there" on the next iteration
}

4) 주장 ( 가이드 ) :

int a = factorial(b);
assert a >= 0: "factorial may not be less than 0"; // throws an AssertionError with the message if the condition evaluates to false

5) switch 문의 사례 ( Tutorial ) :

switch (type) {
    case WHITESPACE:
    case RETURN:
        break;
    case NUMBER:
        print("got number: " + value);
        break;
    default:
        print("syntax error");
}

6) 메서드 참조 ( Tutorial )

class Person {
   public static int compareByAge(Person a, Person b) {
       return a.birthday.compareTo(b.birthday);
   }}
}

Arrays.sort(persons, Person::compareByAge);

3
멋지다-나는 몇 가지를 놓쳤다! 그리고 나는 당신이 그렇게 주장하는 것을 매우 유용하게 말할 수 있다는 것을 몰랐습니다.
Claudiu

.NET (C #)에서 온 문제의 구조에 대한 가장 가까운 비유는 for-each가 될 것입니다.
로저

2
실패 assert는 "프로그램을 종료"하지 않습니다. 그것은을 던졌습니다 AssertionError. 유일한 나머지 비 데몬 스레드의 스택에 던져지고 잡히지 않은 경우에만 프로그램이 종료됩니다.
Stephen C

:) 연산자 : 당신이 모두를 포함하는 것을 목표로한다면, 나는 이중 콜론 (추가 할
kiedysktos

1
또한 메서드 참조에는 이중 콜론이 사용됩니다.
Daniel M.

34

"콜론"연산자는 없지만 콜론은 두 위치에 나타납니다.

1 : 삼항 연산자에서, 예 :

int x = bigInt ? 10000 : 50;

이 경우 삼항 연산자는 표현식의 'if'역할을합니다. bigInt가 참이면 x는 10000이 할당됩니다. 그렇지 않다면, 50. 여기서 콜론은 "else"를 의미합니다.

2 : for-each 루프에서 :

double[] vals = new double[100];
//fill x with values
for (double x : vals) {
    //do something with x
}

그러면 x가 'vals'의 각 값으로 차례로 설정됩니다. 따라서 vals에 [10, 20.3, 30, ...]이 포함 된 경우 x는 첫 번째 반복에서 10, 두 번째 반복에서 20.3 등이됩니다.

참고 : 단지 구문이기 때문에 연산자가 아니라고 말합니다. 주어진 표현식 자체로는 나타날 수 없으며 for-each 및 삼항 연산자 모두 콜론을 사용할 가능성이 있습니다.


하반기가 도움이
됐습니다.

for-each 루프에서 수행하는 작업에 대한 자세한 설명은 +1입니다.
dfarrell07 2014 년

18

추가하기 만하면 for-each 루프에서 사용할 때 ":"는 기본적으로 "in"으로 읽을 수 있습니다.

그래서

for (String name : names) {
    // remainder omitted
}

"각 이름 IN 이름에 대해 ..."로 읽어야합니다.


15

":"를 통합하지 않도록이 for-each 루프를 다른 방식으로 작성하는 방법은 무엇입니까?

그 가정하면 listA는 Collection예 ...

public String toString() {
   String cardString = "";
   for (Iterator<PlayingCard> it = this.list.iterator(); it.hasNext(); /**/) {
      PlayingCard c = it.next();
      cardString = cardString + c + "\n";
   }
}

:이 맥락에서 연산자가 아닌 현명한 점을 추가해야합니다 . 연산자는 표현식에서 작업을 수행 하고 JLS에 따르면 명령문 ( ... )for내용은 표현식이 아닙니다.


내 질문은 : 왜? 왜 똑같은 일을 먼 길을 가는가?
RichN 2010 년

2
@RichN-그는 그것을하고 싶지 않고 방법을 알고 싶어합니다.
Stephen C

3
숙제가 아니라 논리를 이해할 수 있도록 긴 방법을 알고 싶습니다
lemon

사실 내 (나쁜) 대학에서 컴퓨터 공학 공부를하는 동안 그들은 자바 과정에서 (:)에 대해 아무것도 가르쳐주지 않았고, 나중에 예제를 보면서 배우게되었고, 불행히도 지금 코딩하기가 어렵습니다. 내 마음에 나는 유니에서 먼 길 모든 프로젝트를 한 이후
카를로스 산체스

이것이 list의 인스턴스 라고 가정 할 필요가 없습니다 Collection. Iterable향상된 for 루프에서 사용할 수 있는지 여부 의 인스턴스 여야합니다. 즉, iterator()응답에서 호출 하는 메서드를 갖게됩니다 .
Kröw

1

for 루프에서 객체 목록을 반복하는 데 사용됩니다.

for (Object o: list)
{
    // o is an element of list here
}

for <item> in <list>파이썬 으로 생각하십시오 .


1

특정 경우에는

String cardString = "";
for (PlayingCard c : this.list)  // <--
{
    cardString = cardString + c + "\n";
}

this.list컬렉션 (목록, 집합 또는 배열)이고 해당 코드 c는 컬렉션의 각 요소에 할당 됩니다.

따라서 this.list컬렉션 { "2S", "3H", "4S"} 인 cardString경우 끝에는 다음 문자열이됩니다.

2S
3H
4S

1
답변 해 주셔서 감사합니다. ":"를 사용하지 않도록이 코드를 어떻게 다시 작성할 수 있습니까?
레몬

1

일반적으로 삼항 할당 연산자에서 볼 수 있습니다.

통사론

variable =  `condition ? result 1 : result 2;`

예:

boolean isNegative = number > 0 ? false : true;

이것은 본질적으로 if else와 "동등"합니다.

if(number > 0){
    isNegative = false;
}
else{
    isNegative = true;
}

다른 포스터에서 제시 한 예 외에

또한 :를 사용하여 계속 및 중단과 함께 사용할 수있는 블록의 레이블을 나타낼 수 있습니다.

예를 들면 :

public void someFunction(){
     //an infinite loop
     goBackHere: { //label
          for(int i = 0; i < 10 ;i++){
               if(i == 9 ) continue goBackHere;
          }
     }
}

2
미안하지만 끔찍한 예입니다. 왜 부울을 쓰지 않겠습니까? isNegative = number> 0; 삼항 조건은 double sgn = number> 0? 1 : 0;
user44242

@ user44242 lol 예, 왜 그 예를 들었는지 기억이 나지 않습니다.
ultrajohn

1
@ user44242 이와 같은 예제를 표시하면 간단하게 유지하고 조건부 연산자의 작동 방식을 더 잘 보여줍니다. " 부울 isNegative = number> 0; "을 쓰지 않는 이유는 삼항 연산자에 대한 설명이 없기 때문입니다.
Kröw

1

문자열 "something"을 세 번 인쇄합니다.

JLabel[] labels = {new JLabel(), new JLabel(), new JLabel()};                   

for ( JLabel label : labels )                  
 {              
   label.setText("something");  

 panel.add(label);             
 }

1
이 foreach 루프로 위에서 말한
P.JAYASRI

1

대부분의 for 루프는 매우 유사하기 때문에 Java는 for each 루프라는 루프를 작성하는 데 필요한 코드 양을 줄이는 단축키를 제공합니다.

다음은 각 루프의 간결한 예입니다.

for (Integer grade : quizGrades){
      System.out.println(grade);
 }    

위의 예에서 콜론 (:)은 "in"으로 읽을 수 있습니다. for each 루프는 모두 "quizGrades의 각 Integer 요소 (등급이라고 함)에 대해 등급 값을 인쇄"로 읽을 수 있습니다.


0

새로운 약식 for / loop에서 사용됩니다.

final List<String> list = new ArrayList<String>();
for (final String s : list)
{
   System.out.println(s);
}

삼항 연산자

list.isEmpty() ? true : false;

그게 새 것인지 몰랐는데 ... 언제 들어 왔어?
Ritwik Bose


3
D : ... 육년 전에 참조 내 프레임에 의해 새로운되지 않았 음을 ... 오
Ritwik 보스

2
나는 piggles와 함께 있습니다-6 년은 그것이 거의 시간이 시작된 이후로 주변에 있었다는 것을 의미합니다.
James Moore

0

콜론은 실제로 다음과 함께 존재합니다. ?

int minVal = (a < b) ? a : b;

다음과 같습니다.

int minval;
if(a < b){ minval = a;} 
else{ minval = b; }

또한 for each 루프에서 :

for(Node n : List l){ ... }

말 그대로 :

for(Node n = l.head; n.next != null; n = n.next)

0

콜론은 for-each 루프에서 사용하고 있습니다.이 예제를 시도해보세요.

import java.util.*;

class ForEachLoop
{
       public static void main(String args[])
       {`enter code here`
       Integer[] iray={1,2,3,4,5};
       String[] sray={"ENRIQUE IGLESIAS"};
       printME(iray);
       printME(sray);

       }
       public static void printME(Integer[] i)
       {           
                  for(Integer x:i)
                  {
                    System.out.println(x);
                  }
       }
       public static void printME(String[] i)
       {
                   for(String x:i)
                   {
                   System.out.println(x);
                   }
       }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.