이 포스팅은 if 조건문, 참조타입 String, Null 에 대해 알지 못하면 이해할 수 없다.
만약 이해가 가지 않는다면,
if 조건문,참조타입 String, Null 에 대해 공부한 뒤에 다시 보는것을 추천한다.
&와 && 의 차이점
&와 && 는 여러개의 조건식을 하나로 연결하는 AND 연산자이다.
조건식이 모두 true 일때만 true 를 반환하며, &와 &&는 같은 결과를 도출한다.
하지만 &와 &&에는 차이점이 있다.
& 는 앞의 조건식이 false 여도 뒤의 조건식이 true인지 false 인지 판별한다. 어차피 결과는 false인데도 말이다.
&& 는 앞의 조건식이 false 라면, 뒤의 조건식은 true인지 false인지 신경쓰지 않는다. 어차피 결과는 false이기 때문이다.
그럼 && 만 사용하면 되는거 아닌가?
여기서 이런 의문을 가질 수 있다.
그럼 어차피 결과가 똑같다면, 그냥 && 만 사용해서 더 빠르게 결과를 내면 되는 것 아닌가?
만약 첫번째 조건식이 false 라면 어차피 뒤는 볼것도 없이 false 이니,
굳이 뒤까지 검사하는 & 를 쓸 이유가 없으니까 말이다.
하지만 과연 그럴까?
그렇지 않다.
아래 & 의 예시를 보자.

먼저 코드해석을 해보자.
문자열을 저장하는 String 타입의 변수 a 에 "hi" 라는 문자열을 저장하고, 변수 b 에 null 값을 주었다.
( ※ null 은 아무것도 저장하지 않겠다는 의미이다. )
그리고 if 문의 조건으로 a와 "hh" 가 같으면서 b와 "b" 가 같으면 true 를 출력하고, 그렇지않으면 false 를 출력한다.
그런데 이 코드에서 a는 "hi" 이므로 "hh" 와 같지 않으니 첫번째 조건식은 false 이다.
그럼 둘다 true여야 하는 AND연산식의 결과는 false 이기때문에 else문을 찾아가 false 를 출력할 것 같지만
& 연산자는 앞서 말했듯이 앞의 조건식이 false 여도 뒤의 조건식까지 검사한다.
뒤의 조건식을 검사하는 과정에서, b.equals("b") 의 b 는 null 이므로 NullPointerException 이 발생해버린다.
( ※ 이것은 나중에 예외처리에서 자세히 다루게 될 것이다. )
NullPointerException에 대해 간단히 설명하자면, 객체를 '정의'해놓고 '생성'하지 않은 객체(null 인 객체)를 사용하려고 할때 나는 에러이다.
앞에서 String 타입의 b라는 변수는 선언(정의) 해놓고, 정작 null값을 주어 아무것도 ‘생성’하지는 않았다.
그래서 NullPointerException 이 발생한 것이다.
반면에, 아래 && 의 예시를 보자.

같은 코드에 & 를 &&로 바꾸었다.
&& 연산자는 앞의 조건식이 false 이면 뒤의 조건식은 검사하지않고 false 라는 결과를 반환한다.
그러니 두번째 조건식에서의 NullPointerException 은 발생하지 않고 else 문으로 넘어가 false 를 출력한다.
이처럼 같은 코드임에도 & 를 쓴 코드는 에러가 났고, &&를 쓴 코드는 정상 실행 됨을 확인할 수 있다.
그러므로 &와 &&의 차이점을 정확히 알고 상황에 따라 선별하여 사용해야한다.
예를들어 조건문 수식을 세울 때 해당객체가 null 인지 아닌지 판별하는 용도로 &&연산자를 사용할 수 있다.
아래와 같이 말이다.
if ( 객체 != null && 객체.getName().equals("name") ) {
명령문1 }
else { 명령문2 }
( ※ getName() 메소드는 객체나 파일의 이름을 가져온다. )
getName() 메소드를 통해 객체의 이름이 "name" 이 맞다면, 명령문1을 수행하도록 하는 if문을 만들고
만약 그 객체가 null 이라면 명령문1을 수행하지 않고 그냥 넘어가도록했다. 바로 이때 &&연산자를 이용하는 것이다.위 코드의 &&연산자는 객체 != null 의 결과가 false 라면 (즉, 객체가 null 이라면) 다음 조건은 검사하지 않은 채, 바로 else문으로 넘어갈것이다.
그런데 만약 여기서 &를 쓴다면?
내가 사용하려던 객체가 null 이었다고 가정하자.
&연산자는 첫번째 조건식에서 이미 false임을 알았지만, 두번째 조건식도 검사할것이다.
두번째 조건식을 검사하는데, null인 이 객체의 이름을 가져오라는 명령문이 있다. 생성하지 않은 객체를 사용하려고 하는것이다.
이때 NullPointerException 에러가 나면서 프로그램 자체가 실행되지못한다.
위의 코드에서는
&&를 쓰면 null인지 아닌지도 판별하고 내가 찾는 객체가 맞는지 객체명도 확인하여 명령문을 실행할 수 있었는데,
&를 쓰니 아예 컴파일에러가 나버린다.
이제 & 와 && 의 차이점과 어떤 상황에 구분하여 사용할지도 어느정도 감이 잡혔을것이다.
OR 연산자 | 와 ||도 위와 같다
'Java > Standard' 카테고리의 다른 글
Scanner.nextInt() / nextLine() 오류 : 두가지 해결방법 (0) | 2020.06.19 |
---|---|
반복문 : while 과 do~while (0) | 2020.06.18 |
반복문 완전 기초 이해하기 : for문 (0) | 2020.06.18 |
2진수,8진수,16진수의 모든것 (17) | 2020.06.16 |
long,float 의 값 뒤에 L,F 을 붙여야 하는 이유 (0) | 2020.06.11 |
이 포스팅은 if 조건문, 참조타입 String, Null 에 대해 알지 못하면 이해할 수 없다.
만약 이해가 가지 않는다면,
if 조건문,참조타입 String, Null 에 대해 공부한 뒤에 다시 보는것을 추천한다.
&와 && 의 차이점
&와 && 는 여러개의 조건식을 하나로 연결하는 AND 연산자이다.
조건식이 모두 true 일때만 true 를 반환하며, &와 &&는 같은 결과를 도출한다.
하지만 &와 &&에는 차이점이 있다.
& 는 앞의 조건식이 false 여도 뒤의 조건식이 true인지 false 인지 판별한다. 어차피 결과는 false인데도 말이다.
&& 는 앞의 조건식이 false 라면, 뒤의 조건식은 true인지 false인지 신경쓰지 않는다. 어차피 결과는 false이기 때문이다.
그럼 && 만 사용하면 되는거 아닌가?
여기서 이런 의문을 가질 수 있다.
그럼 어차피 결과가 똑같다면, 그냥 && 만 사용해서 더 빠르게 결과를 내면 되는 것 아닌가?
만약 첫번째 조건식이 false 라면 어차피 뒤는 볼것도 없이 false 이니,
굳이 뒤까지 검사하는 & 를 쓸 이유가 없으니까 말이다.
하지만 과연 그럴까?
그렇지 않다.
아래 & 의 예시를 보자.

먼저 코드해석을 해보자.
문자열을 저장하는 String 타입의 변수 a 에 "hi" 라는 문자열을 저장하고, 변수 b 에 null 값을 주었다.
( ※ null 은 아무것도 저장하지 않겠다는 의미이다. )
그리고 if 문의 조건으로 a와 "hh" 가 같으면서 b와 "b" 가 같으면 true 를 출력하고, 그렇지않으면 false 를 출력한다.
그런데 이 코드에서 a는 "hi" 이므로 "hh" 와 같지 않으니 첫번째 조건식은 false 이다.
그럼 둘다 true여야 하는 AND연산식의 결과는 false 이기때문에 else문을 찾아가 false 를 출력할 것 같지만
& 연산자는 앞서 말했듯이 앞의 조건식이 false 여도 뒤의 조건식까지 검사한다.
뒤의 조건식을 검사하는 과정에서, b.equals("b") 의 b 는 null 이므로 NullPointerException 이 발생해버린다.
( ※ 이것은 나중에 예외처리에서 자세히 다루게 될 것이다. )
NullPointerException에 대해 간단히 설명하자면, 객체를 '정의'해놓고 '생성'하지 않은 객체(null 인 객체)를 사용하려고 할때 나는 에러이다.
앞에서 String 타입의 b라는 변수는 선언(정의) 해놓고, 정작 null값을 주어 아무것도 ‘생성’하지는 않았다.
그래서 NullPointerException 이 발생한 것이다.
반면에, 아래 && 의 예시를 보자.

같은 코드에 & 를 &&로 바꾸었다.
&& 연산자는 앞의 조건식이 false 이면 뒤의 조건식은 검사하지않고 false 라는 결과를 반환한다.
그러니 두번째 조건식에서의 NullPointerException 은 발생하지 않고 else 문으로 넘어가 false 를 출력한다.
이처럼 같은 코드임에도 & 를 쓴 코드는 에러가 났고, &&를 쓴 코드는 정상 실행 됨을 확인할 수 있다.
그러므로 &와 &&의 차이점을 정확히 알고 상황에 따라 선별하여 사용해야한다.
예를들어 조건문 수식을 세울 때 해당객체가 null 인지 아닌지 판별하는 용도로 &&연산자를 사용할 수 있다.
아래와 같이 말이다.
if ( 객체 != null && 객체.getName().equals("name") ) {
명령문1 }
else { 명령문2 }
( ※ getName() 메소드는 객체나 파일의 이름을 가져온다. )
getName() 메소드를 통해 객체의 이름이 "name" 이 맞다면, 명령문1을 수행하도록 하는 if문을 만들고
만약 그 객체가 null 이라면 명령문1을 수행하지 않고 그냥 넘어가도록했다. 바로 이때 &&연산자를 이용하는 것이다.위 코드의 &&연산자는 객체 != null 의 결과가 false 라면 (즉, 객체가 null 이라면) 다음 조건은 검사하지 않은 채, 바로 else문으로 넘어갈것이다.
그런데 만약 여기서 &를 쓴다면?
내가 사용하려던 객체가 null 이었다고 가정하자.
&연산자는 첫번째 조건식에서 이미 false임을 알았지만, 두번째 조건식도 검사할것이다.
두번째 조건식을 검사하는데, null인 이 객체의 이름을 가져오라는 명령문이 있다. 생성하지 않은 객체를 사용하려고 하는것이다.
이때 NullPointerException 에러가 나면서 프로그램 자체가 실행되지못한다.
위의 코드에서는
&&를 쓰면 null인지 아닌지도 판별하고 내가 찾는 객체가 맞는지 객체명도 확인하여 명령문을 실행할 수 있었는데,
&를 쓰니 아예 컴파일에러가 나버린다.
이제 & 와 && 의 차이점과 어떤 상황에 구분하여 사용할지도 어느정도 감이 잡혔을것이다.
OR 연산자 | 와 ||도 위와 같다
'Java > Standard' 카테고리의 다른 글
Scanner.nextInt() / nextLine() 오류 : 두가지 해결방법 (0) | 2020.06.19 |
---|---|
반복문 : while 과 do~while (0) | 2020.06.18 |
반복문 완전 기초 이해하기 : for문 (0) | 2020.06.18 |
2진수,8진수,16진수의 모든것 (17) | 2020.06.16 |
long,float 의 값 뒤에 L,F 을 붙여야 하는 이유 (0) | 2020.06.11 |