학습 목표
- 비교 연산자와 논리 연산자의 사용에 대해 설명할 수 있다.
- 복합적인 조건식을 구성할 수 있다.
- 수치와 진법에 대해 설명할 수 있다.
- 자료현간의 형 변환에 대해 설명할 수 있다.
- System.out.printf() 메소드의 사용법에 대해 설명할 수 있다.
학습 내용
비교 연산자
변수의 값이나 수치의 크기를 비교하는 연산으로 결과는 true 아니면 false임
비교 연산은 프로그램의 조건 실행을 위한 조건식에 자주 사용됨
연잔자 | 사용법 | 의미 |
== | a==b | a와 b는 같다 |
< | a<b | a는 b보다 작다 |
> | a>b | a는 b보다 크다 |
<= | a<= b | a는 b보다 작거나 같다 |
>= | a>= b | a는 b보다 크거나 같다 |
!= | a!=b | a와 b는 같지 않다 |


해당 방법으로 true와 false를 출력함을 확인할 수 있다.
여기서 비교 연산자는 + 연산보다 우선순위가 낮기 때문에 println 함수 내에서 +를 사용해서 문자열을 출력하는 경우 비교 연산식을 ()로 묶어주어야 함
그렇지 않으면 컴파일 에러가 발생함
문자의 크고 작음 또한 비교할 수 있다.


자바는 내부적으로 유니코드를 사용하기 때문에 문자의 대소를 비교할 수 있다.


char 현과 byte 정수형간의 비교 연산 또한 가능하다.
문자열을 비교하기 위해선 == 비교 연산자가 아닌 equals 메소드를 사용해야 한다
== 비교 연산자는 값이 아닌 참조를 비교하기 때문에 문자열을 갖는 변수값과 참조의 값을 비교하기 위해서는 equals 메소드를 사용해야 한다.


자바의 문자열 비교시 왜 equals 메소드를 써야하는지에 대한 자세한 설명
자바 문자열의 특징
자바와 파이썬은 두 가지 다른 프로그래밍 언어이며, 문자열 비교에 사용되는 연산자들의 동작 방식도 약간 다릅니다. 자바에서는
==
비교 연산자를 사용하여 문자열을 비교할 수는 있지만, 이는 문자열의 참조값을 비교하는 것이기 때문에 원하는 결과를 얻기 어려울 수 있습니다.자바에서 문자열은 객체로 취급됩니다. 따라서
==
연산자는 객체의 참조값을 비교하게 됩니다. 예를 들어, 다음과 같은 코드를 고려해보겠습니다:javaCopy code String str1 = "Hello"; String str2 = "Hello"; System.out.println(str1 == str2); // true
위의 코드에서
str1
과str2
는 둘 다 "Hello"라는 문자열을 가리키고 있습니다. 자바는 문자열 리터럴이 동일한 경우, 동일한 문자열 리터럴을 공유하기 때문에str1
과str2
는 동일한 참조값을 가지게 됩니다. 따라서str1 == str2
의 결과는true
입니다.그러나 다음과 같은 경우에는
==
연산자를 사용하여 문자열을 비교하는 것이 예상한 결과를 가져오지 못할 수 있습니다:javaCopy code String str3 = new String("Hello"); String str4 = new String("Hello"); System.out.println(str3 == str4); // false
위의 코드에서
str3
과str4
는 각각 새로운 문자열 객체를 생성하고 있습니다. 이 경우에는==
연산자를 사용하여 참조값을 비교하게 되므로 결과는false
입니다. 즉, 두 개의 다른 객체를 비교하고 있기 때문에==
비교 연산자는 원하는 결과를 제공하지 않습니다.따라서 자바에서 문자열을 비교할 때는
equals()
메서드를 사용하는 것이 좋습니다.equals()
메서드는 문자열의 내용을 비교하기 때문에 예상한 결과를 얻을 수 있습니다. 예를 들어:javaCopy code String str3 = new String("Hello"); String str4 = new String("Hello"); System.out.println(str3.equals(str4)); // true
위의 코드에서
equals()
메서드를 사용하여 문자열을 비교하면 내용이 동일하기 때문에 결과는true
입니다.요약하면, 자바에서 문자열을 비교할 때는
==
비교 연산자를 사용하지 않는 것이 좋으며, 대신equals()
메서드를 사용하여 내용을 비교하는 것이 좋습니다.
참조에 대한 자세한 설명
자바에서 객체는 참조 타입입니다. 변수가 객체를 가리킬 때, 변수는 객체의 "참조값"을 가지고 있습니다. 참조값은 실제 객체의 메모리 주소를 가리키는 값으로, 이를 통해 객체에 접근할 수 있습니다.
예를 들어, 다음과 같은 코드를 고려해봅시다:
javaCopy code String str1 = "Hello"; String str2 = "World";
위의 코드에서
str1
과str2
는 모두String
타입의 변수입니다. 그러나 실제로 이 변수들은 문자열 객체를 가리키고 있습니다. "Hello" 문자열은 문자열 리터럴로 생성되어 메모리에 저장되고,str1
은 해당 리터럴을 가리키는 참조값을 가지게 됩니다. 마찬가지로 "World" 문자열도 리터럴로 생성되고,str2
는 해당 리터럴을 가리키는 참조값을 가지게 됩니다.따라서
str1
과str2
는 실제로 문자열 자체를 가지고 있는 것이 아니라, 해당 문자열을 가리키는 참조값을 가지고 있습니다. 이러한 참조값을 사용하여 변수는 해당 객체에 접근하고 객체의 메서드를 호출하거나 속성에 접근할 수 있습니다.==
연산자를 사용하여 변수들의 값을 비교할 때, 참조 타입인 경우에는 변수들이 동일한 객체를 가리키는지 여부를 비교합니다. 즉,==
연산자는 참조값을 비교합니다. 따라서str1 == str2
는str1
과str2
의 참조값을 비교하며, 두 변수가 동일한 객체를 가리키는지 확인합니다.하지만 문자열의 내용을 비교하기 위해서는
equals()
메서드를 사용해야 합니다.equals()
메서드는String
클래스에 정의된 메서드로, 두 개의 문자열 객체의 내용을 비교하여 동일한지 여부를 판단합니다. 이 메서드는 문자열의 내용을 비교하기 때문에 더 정확한 비교 결과를 얻을 수 있습니다.참조값은 자바의 객체 지향 프로그래밍에서 중요한 개념이며, 객체들 간의 관계와 상호작용을 구현하는 데 사용됩니다.
쉽게 설명하자면 참조값은 일종의 포인터와 유사한 개념이다. 따라서 == 비교연산자는 a의 값을 비교하는 것이 아닌 서로 다른 객체를 비교함으로 false가 출력되는것이다.
여기서 포인터와의 다른 점은 c나 c++에서는 해당 메모리 주소를 직접 조작할 수 있지만, 자바에서는 포인터 개념이 직접 노출되지 않으며, 메모리 주소를 조작할 수 없다.
그러고 자바의 참조값은 객체를 가리키는 값이지만, 포인터처럼 메모리 주소 자체를 나타내지는 않음.
하지만 정수형 변수와 같은 원시 타입은 == 비교연산자를 사용할 시 값 자체를 비교하게 됨으로 신경쓰지 않아도 된다.
boolean형
true 또는 false중 하나의 값을 갖는 변수의 자료형
조건식이나 대입식은 논리형의 값을 가지고 있기 때문에 boolean형에 대입할 수 있음


printf 메소드를 사용할 시 대문자로도 출력이 가능하다.


printf는 파이썬의 format 함수와 비슷한것같다
? 조건 연산자
조건 연산3자 ? : 는 조건식의 값에 따라서 두가지 중 하나의 값을 선택함
선택하는 값은 임의의 수치나 문자, 변수 등을 지정할 수 있음


조건 연산자를 이용한 절대치를 구하는 예


논리 연산자
여러가지 조건을 조합하여 보다 복잡한 조건을 나타낼 때 사용함
논리 연산자에는 세 가지가 있음
연산자 | 이름 | 기능 | 사용 예 | 결과 |
&& | 논리곱 | 그리고 | a && b | a와 b가 동시에 참인 경우에만 참 |
|| | 논리합 | 또는 | a || b | a와 b중 하나만 참이여도 참 |
! | 논리부정 | 부정 | !a | a의 논리값을 부정 |
^ | 배타적 논리합xor | a^b | a와 b가 서로 다른경우에 참 a^b = (!a&&b) || (a&&!b) |
복합 조건식에서 연산의 으선 순위는 다음과 같다
우선순위 | 연산자 | 우선순위가 같은 경우 연산 방향 |
1 | () 괄호 | ⇒ |
2 | ! | ⇒ |
3 | <,>,>=,<= | ⇒ |
4 | ==,!= | ⇒ |
5 | &&,|| | ⇒ |
논리 연산자를 응용하여 윤년 계산 예제를 만들어보았다.


수치와 진법
- 10진법한자라에 올수 있는 기호는 0부터 9까지임.10의 0승과 10의 -1승 사이에는 소수점을 찍음
- 부호는 맨 왼쪽의 숫자 앞에 붙임 (양의 부호 +는 생략해도 됨)
- 일렬로 자리를 나열하면 각 자리는 10의 거듭제곱을 의미
자바에서 10진수의 정수형과 실수형을 모두 표시할 수 있음
실수형에서 맨 앞의 0과 맨 끝의 0은 무시됨
정수형에서 숫자 앞에 0을 붙이면 8진수로 처리됨
- 2진법한자리에 올수 있는 기호는 0,1임2의 0승과 2의 -1승 사이에는 소수점을 찍음각 자리에 대한 이름은 없고 소수점만 점으로 읽음
- 부호는 맨 왼쪽의 숫자 앞에 붙임(양의 부호 +는 생략해도 됨)
- 일렬로 자리를 나열하면 각 자리는 2의 거듭제곱을 의미
- 8진법한자리에 올 수 있는 기호는 0부터 7까지임8의 0승과 8의 -1승 사이에는 소수점을 찍음각 자리에 대한 이름은 없고 소수점만 점으로 읽음
- 부호는 맨 왼쪽의 숫자 앞에 붙임
- 일렬로 자리를 나열하면 각 자리는 8의 거듭제곱을 의미
- 16진법한자리에 올 수 있는 기호는 0부터 E까지임16의 0승과 16의 -1승 사이에는 소수점을 찍음각 자리에 대한 이름은 없고 소수점만 점으로 읽음
- 자바에서 16진수는 정수형만 지원하고 실수형은 지원하지 않음
- 부호는 맨 왼쪽의 숫자 앞에 붙임
- 일렬로 자리를 나열하면 각 자리는 16의 거듭제곱을 의미
형 변환
- 계산 중의 형 변환자바에서는 정수끼리 계산을 하면, 그 결과는 정수가 되는 규칙이 있어 소수 이하는 버림함
- 실수를 포함하는 계산을 할 경우 정수는 자동적으로 실수로 변환되어 계산됨
- 소수점 값을 포함하는 1.5를 ㅅ나출하기 위해서는 실수 표기로 계산해야 함
- 다른 유효범위를 가진 자료형끼리의 대입자료형이 다른 변수끼리 대입할 때, 값의 범위가 작은 변수를 값의 범위가 큰 변수에 대입하면 자료형이 자동적으로 큰 쪽으로 변환됨
- 값의 변위가 큰 변수를 값의 범위가 작은 변수에 대입하면 컴파일 에러가 발생함
- cast 연산자(int) 처럼 자료형의 이름을 ()로 둘러싸서 다른 자료형의 값이나 변수 앞에 쓰면, 특정한 자료형으로 변환할 수 있음표현 범위가 큰 쪽에서 작은 쪽으로 형 변환 시는 주의해야 함
- 이러한 자료형 변환을 형 변환 ( 캐스트 : cast ) 라고 하며, “(자료형)”을 캐스트 연산자라고 함


printf 메소드
수치, 문자, 문자열 등의 자료와 변수에 대해 서식을 지정하여 출력할 수 있음
c언어의 printf() 함수와 유사함
자료형에 따른 서식 지정은 다음과 같다
서식 지정 | 의미 | 데이터 예 |
%d | 정수를 10진수로 표시 | 1,2,-4 |
%o | 정수를 8진수로 표시 | 03,07 |
%x, %X | 정수를 16진수로 표시 | 0x12, 0X2A |
%f | 실수를 표시 | 1.23, -4.56 |
%e, %E | 지수 형식으로 표시 | 1.23e3, -4.56E-2 |
%c | 문자(”로 에워싼 문자 1개)를 표시 | “A”,”ABC” |
%b, %B | 불린값을 true,false로 표시 | true, false |
'코딩딩 > Java' 카테고리의 다른 글
비트 연산자와 시프트 연산자, 각종 조건문과 반복문 (0) | 2023.06.29 |
---|---|
클래스와 메소드 (0) | 2023.06.29 |
자바의 데이터 입력 방법, 배열, 각종 연산자 (0) | 2023.06.28 |
자료구조 - Arraylist (0) | 2023.05.14 |
자바의 변수 (1) | 2023.05.10 |