본문 바로가기
computing

20250327_java4 (자바 자료형, 연산자, 형변환 핵심요약)

by greentworkshop 2025. 3. 27.
public class ObjectCreationTest {
public static void main(String[] args) {
	ObjectCreation oc1 = new ObjectCreation();
	ObjectCreation oc2 = new ObjectCreation();
	ObjectCreation oc3 = new ObjectCreation();
	}
}
class ObjectCreation {
	static int objCount; // 기본값으로 초기화를 수행한다.
	public ObjectCreation() {
	objCount++;
System.out.println(objCount + "번째 객체를 생성하였습니다" );
	}
}

이 코드는 ObjectCreation 클래스의 객체가 생성될 때마다 objCount 변수의 값이 증가하며 생성된 객체의 순서를 출력하는 예제입니다.

각 요소들의 역할과 상호 관계를 다음과 같이 설명할 수 있습니다.

클래스와 메소드 설명

  1. ObjectCreationTest 클래스
    • main 메소드가 포함된 클래스입니다. 자바 프로그램에서 실행이 시작되는 지점은 main 메소드입니다. 이 클래스에서 ObjectCreation 클래스의 객체들을 생성합니다.
  2. ObjectCreation 클래스
    • ObjectCreation 클래스는 객체가 생성될 때마다 objCount를 증가시키고, 몇 번째 객체가 생성되었는지를 출력하는 역할을 합니다.

각 요소의 역할과 상호 관계

  1. static int objCount
    • objCount는 static 변수입니다. static 키워드를 사용한 변수는 클래스 레벨에서 공유됩니다.
      즉, ObjectCreation 클래스 내부의 모든 객체가 같은 objCount 변수를 공유하게 됩니다.
      이 변수는 객체가 생성될 때마다 증가하는데, 클래스의 모든 객체가 동일한 변수에 접근하므로 객체 간에 값을 공유합니다.
    • objCount의 기본값은 0입니다. static 변수는 클래스 로드시 자동으로 0으로 초기화됩니다.
  2. public ObjectCreation()
    • 생성자입니다. 이 생성자는 ObjectCreation 클래스의 객체가 생성될 때 호출됩니다.
    • public 접근 제어자는 이 생성자가 클래스 외부에서도 호출될 수 있다는 것을 의미합니다. 즉, 이 클래스의 객체를 생성할 때 외부에서 이 생성자를 호출할 수 있습니다.
    • 생성자 내부에서 objCount++를 통해 objCount 값을 1 증가시키고, 그 후에 System.out.println()을 사용하여 "몇 번째 객체를 생성했는지" 출력합니다.
  3. main 메소드 (ObjectCreationTest 클래스)
    • main 메소드에서는 ObjectCreation 클래스의 객체 oc1, oc2, oc3를 각각 생성합니다. 객체가 생성될 때마다 ObjectCreation 생성자가 호출되므로 objCount 값이 증가하고, 객체가 생성되었다는 메시지가 출력됩니다.

상호 관계

  1. 객체 생성과 objCount
    • main 메소드에서 ObjectCreation oc1 = new ObjectCreation(); 라인이 실행되면, ObjectCreation 클래스의 생성자가 호출됩니다.
    • 생성자 내부에서 objCount++가 실행되면서 objCount의 값은 1로 증가하고, "1번째 객체를 생성하였습니다"라는 출력이 발생합니다.
    • 두 번째 객체인 oc2가 생성될 때에도 동일한 방식으로 생성자가 호출되며, objCount는 2로 증가하고 "2번째 객체를 생성하였습니다"라는 메시지가 출력됩니다.
    • 세 번째 객체인 oc3도 마찬가지로 생성자가 호출되어 objCount는 3으로 증가하고 "3번째 객체를 생성하였습니다"라는 메시지가 출력됩니다.
  2. static 변수의 특징
    • objCount가 static으로 선언되어 있기 때문에, oc1, oc2, oc3는 모두 같은 objCount 변수를 참조합니다. 따라서 각 객체가 생성될 때마다 objCount는 클래스 수준에서 공유되어 증가합니다.

최종 출력

프로그램이 실행되면 다음과 같은 출력이 발생합니다.

복사
1번째 객체를 생성하였습니다 2번째 객체를 생성하였습니다 3번째 객체를 생성하였습니다

이 출력은 ObjectCreation 클래스의 각 객체가 생성될 때마다 objCount가 증가하고, 그 값을 출력하는 생성자에서 나온 결과입니다.


Java의 형 변환 (Type Conversion)

올바른 연산을 수행하기 위해서는 피연산자들의 자료형이 일치해야 한다. 이를 위해 형 변환이 필요하며, 형 변환은 다음과 같이 분류된다.

1. 형 변환의 종류

  • 기본형 변환 (Primitive Conversion)
  • 참조형 변환 (Reference Conversion)
  • 박싱/언박싱 (Boxing/Unboxing)
    • 박싱(Boxing): 기본형 데이터를 참조형으로 변환
    • 언박싱(Unboxing): 참조형 데이터를 기본형으로 변환

2. 기본형 형 변환

형 변환은 명시적 형 변환묵시적 형 변환으로 나뉜다.

🔹 명시적 형 변환 (Explicit Conversion)

  • 프로그래머가 직접 형 변환을 수행해야 한다.
  • 큰 타입 → 작은 타입 변환 시 반드시 명시해야 하며, 데이터 손실이 발생할 수 있다.
  • 문법: (자료형) 피연산자
  • 예제:
  • java
    복사편집
    int intValue; float floatValue = 3.5f; intValue = (int) floatValue; // 소수점 이하가 손실됨
  • 정밀도 손실 가능성:
    • int → float → int
    • long → float → long
    • long → double → long

🔹 묵시적 형 변환 (Implicit Conversion)

  • 컴파일러가 자동으로 수행하며, 정보 손실이 없는 경우에 발생.
  • 작은 타입 → 큰 타입 변환 시 자동으로 이루어진다.
    (이를 광역화 형 변환이라고 함)
  • 예제:
  • java
    복사편집
    int intValue = 100; double doubleValue = intValue; // int → double 자동 변환
  • 광역화 형 변환 예시:
    • byte → short → int → long → float → double
  • 협소화 형 변환 (큰 타입 → 작은 타입)
    • 명시적 형 변환이 필요하며, 그렇지 않으면 컴파일 오류 발생.
    • 예시:
      • int → byte, short, char
      • long → int, short, byte, char
      • float → int, long, short, byte, char
      • double → float, long, int, short, byte, char

3. 정리

  • 묵시적 형 변환: 작은 크기의 타입을 큰 크기의 타입으로 변환 (데이터 손실 없음)
  • 명시적 형 변환: 큰 크기의 타입을 작은 크기의 타입으로 변환 (데이터 손실 가능)
  • 박싱/언박싱: 기본형과 참조형 간의 변환

형 변환을 올바르게 이해하고 사용하면, 데이터 손실을 방지하고 안전한 프로그래밍이 가능하다.


자바에서 사용되는 연산자 종류와 그에 해당하는 연산자의 우선순위 및 자료형에 대해 정리해보겠습니다. 연산자는 다양한 종류가 있으며, 이를 잘 이해하고 사용하는 것이 중요합니다.

1. 연산자 종류

자바의 연산자는 크게 14가지로 분류할 수 있습니다.

(1) 괄호 및 참조 연산자

  • [] : 배열 접근
  • () : 괄호 (우선순위 변경, 메소드 호출, 형변환)
  • . : 멤버 접근 (필드, 메소드 접근)

(2) 증감 연산자 (Postfix와 Prefix)

  • ++ (Postfix) : 후위 증가 연산자
  • -- (Postfix) : 후위 감소 연산자
  • ++ (Prefix) : 전위 증가 연산자
  • -- (Prefix) : 전위 감소 연산자

(3) 산술 연산자

  • * : 곱셈
  • / : 나눗셈
  • % : 나머지
  • + : 덧셈
  • - : 뺄셈

(4) 관계 연산자

  • > : 크다
  • < : 작다
  • >= : 크거나 같다
  • <= : 작거나 같다
  • == : 같다
  • != : 같지 않다
  • instanceof : 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인

(5) 비트 연산자

  • ~ : 비트 NOT (1의 보수)
  • >> : 비트 오른쪽 시프트
  • << : 비트 왼쪽 시프트
  • >>> : 부호 없는 비트 오른쪽 시프트
  • & : 비트 AND
  • | : 비트 OR
  • ^ : 비트 XOR (배타적 OR)

(6) 논리 연산자

  • && : 논리 AND
  • || : 논리 OR
  • ! : 논리 NOT

(7) 조건 연산자 (삼항 연산자)

  • ? : : 조건 연산자 (조건 ? 참일 때 : 거짓일 때)

(8) 배정 연산자

  • = : 단순 대입
  • += : 덧셈 후 대입
  • -= : 뺄셈 후 대입
  • *= : 곱셈 후 대입
  • /= : 나눗셈 후 대입
  • %= : 나머지 후 대입
  • &= : 비트 AND 후 대입
  • ^= : 비트 XOR 후 대입
  • |= : 비트 OR 후 대입
  • <<= : 비트 왼쪽 시프트 후 대입
  • >>= : 비트 오른쪽 시프트 후 대입
  • >>>= : 부호 없는 비트 오른쪽 시프트 후 대입

(9) 부호 연산자

  • + : 양수 부호
  • - : 음수 부호

(10) 생성 및 형변환 연산자

  • new : 객체 생성
  • (type) : 형변환 (캐스팅)

2. 자료형 우선순위

자바에서 연산자의 우선순위는 다음과 같은 규칙을 따릅니다. 우선순위가 높은 연산자가 먼저 실행됩니다. 이 우선순위를 잘 이해하고 있으면 연산자를 더 효과적으로 사용할 수 있습니다.

  1. 괄호 (), 배열 인덱스 [], 멤버 접근 연산자 .
  2. 전위/후위 증감 연산자 ++, --
  3. 단항 연산자 +, -, ~, !
  4. 산술 연산자 *, /, %
  5. 산술 연산자 +, -
  6. 비트 이동 연산자 <<, >>, >>>
  7. 비트 연산자 &, ^, |
  8. 관계 연산자 >, <, >=, <=, ==, !=
  9. 논리 연산자 &&, ||
  10. 조건 연산자 ? :
  11. 대입 연산자 =, +=, -=, *=, /=, %= 등
  12. 배타적 논리 연산자 instanceof

3. 자료형

자바에서 주요한 자료형들을 정리해보면 다음과 같습니다:

(1) 기본 자료형 (Primitive Types)

  • 정수형:
    • byte (1 byte, -128 to 127)
    • short (2 bytes, -32,768 to 32,767)
    • int (4 bytes, -2^31 to 2^31-1)
    • long (8 bytes, -2^63 to 2^63-1)
  • 실수형:
    • float (4 bytes)
    • double (8 bytes)
  • 문자형:
    • char (2 bytes, Unicode 문자)
  • 논리형:
    • boolean (true, false)

(2) 참조형 (Reference Types)

  • 클래스 타입
  • 배열
  • 인터페이스
  • 열거형 (enum)
  • String (문자열 타입)

4. 자료형 우선순위 (형변환)

  • 기본적으로 작은 범위의 자료형에서 큰 범위의 자료형으로 변환하는 자동 형변환이 일어납니다.
    • 예: int -> long, float -> double
  • 명시적 형변환(casting)을 통해 큰 자료형에서 작은 자료형으로 변환할 수 있습니다.
    • 예: double -> (int) (명시적 캐스팅)

5. 빠진 자료형 및 참고

  • String: 자바에서는 String이 기본형은 아니지만, 매우 중요한 자료형입니다.
    • String은 사실 참조형 데이터 타입입니다. 하지만 문자열 연산에 자주 사용되고, 특수한 메소드를 많이 제공합니다.
  • Wrapper 클래스: 기본 자료형을 객체로 감싸는 클래스들이 있습니다. 예: Integer, Double, Character, Boolean 등.

결론

자바의 연산자는 매우 다양한 종류가 있으며, 이들을 올바르게 이해하고 사용하기 위해서는 연산자의 우선순위와 자료형에 대한 기본적인 이해가 필요합니다. 연산자 간의 우선순위는 중요하며, 이를 제대로 파악하고 필요한 경우 괄호를 적절히 사용하여 코드의 가독성과 정확성을 높일 수 있습니다.


Java의 자료형(Primitive Type & Reference Type)

Java의 자료형은 크게 **기본 자료형(Primitive Type)**과 **참조 자료형(Reference Type)**으로 나뉜다.


1. 기본 자료형 (Primitive Type)

기본 자료형은 Java에서 가장 기본이 되는 데이터 타입으로, 직접 값을 저장한다.
8가지의 기본 자료형이 존재하며, 각 자료형은 메모리에 고정된 크기의 공간을 차지한다.

📌 정수형 (Integer Type)


 

자료형 크기 (비트) 값의 범위 기본값
byte 8비트 -128 ~ 127 0
short 16비트 -32,768 ~ 32,767 0
int 32비트 -2,147,483,648 ~ 2,147,483,647 0
long 64비트 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 0L
  • byte와 short는 메모리 절약이 필요할 때 사용.
  • int는 일반적인 정수 연산에 사용되는 기본 자료형.
  • long은 큰 정수 값을 다룰 때 사용하며, L을 붙여 표현함. (예: long l = 10000000000L;)

📌 실수형 (Floating Point Type)

자료형 크기(비트) 표현 방식 값의 범위 기본값
float 32비트 단정밀도 (소수점 이하 약 7자리) ±1.4E-45 ~ ±3.4E+38 0.0f
double 64비트 배정밀도 (소수점 이하 약 15자리) ±4.9E-324 ~ ±1.8E+308 0.0d
  • float은 F 또는 f를 붙여 사용 (예: float f = 3.14f;).
  • double은 Java의 기본 실수형으로, 정밀도가 높아 실수 연산에 자주 사용됨.

📌 문자형 (Character Type)

자료형 크기(비트) 값의 범위 기본값
char 16비트 0 ~ 65,535 (유니코드) '\u0000' (널 문자)
  • char는 하나의 문자(예: 'A', '한')를 저장하며, 유니코드를 사용.
  • 작은 정수와 호환 가능 (char c = 65; → 'A' 저장됨).

📌 논리형 (Boolean Type)

자료형 크기(비트) 값의 범위 기본값
boolean 1비트 (논리적으로) true(0) 또는 false(1) false
  • boolean은 참(true) 또는 거짓(false) 값만 가질 수 있음.
  • 조건문 (if, while)에서 주로 사용됨.

2. 참조 자료형 (Reference Type)

참조 자료형은 기본 자료형이 아닌 객체를 가리키는 타입이다.
참조형 변수는 실제 데이터를 저장하지 않고, **메모리 주소(참조 값)**를 저장한다.

📌 주요 참조 자료형

  1. 배열(Array)
    • 동일한 자료형의 여러 데이터를 저장하는 구조.
    • 예제:
    • java
      복사편집
      int[] numbers = {1, 2, 3, 4, 5}; String[] names = {"Alice", "Bob", "Charlie"};
  2. 클래스(Class)
    • 사용자가 정의하는 객체 지향적 자료형.
    • 예제:
    • java
      복사편집
      class Person { String name; int age; }
  3. 인터페이스(Interface)
    • 클래스가 구현해야 하는 메서드의 집합.
  4. 열거형(Enum)
    • 특정한 값들의 집합을 정의하는 자료형.
    • 예제:
    • java
      복사편집
      enum Color { RED, GREEN, BLUE }
  5. 문자열(String)
    • String은 기본 자료형이 아닌 객체지만, Java에서 특별 취급받음.
    • 불변(immutable) 객체이므로, 수정 시 새로운 String 객체가 생성됨.
    • 예제:
    • java
      복사편집
      String s1 = "Hello"; String s2 = new String("World");

3. 기본 자료형 vs 참조 자료형 비교

구분 기본 자료형 (Primitive Type) 참조 자료형 (Reference Type)
저장 방식 실제 값을 저장 객체의 메모리 주소를 저장
크기 고정된 크기 (ex. int → 4바이트) 동적 크기 (객체 크기에 따라 다름)
비교 방식 == 비교 시 값 비교 == 비교 시 주소 비교
초기화 0, false, \u0000 등 기본값 존재 null로 초기화 가능
예제 int a = 10; String s = "Hello";

4. 정리

기본 자료형: byte, short, int, long, float, double, char, boolean (값을 직접 저장)
참조 자료형: String, 배열, 클래스, 인터페이스, 열거형 (객체의 주소를 저장)

👉 기본 자료형은 Stack 메모리에 직접 저장되며, 참조 자료형은 Heap 메모리에 객체가 저장되고, 변수는 그 주소를 참조한다.


Java 형변환 개념 분석 - 코드파일 실습예제

1️⃣ ArithmeticOpTest1.java 분석

public class ArithmeticOpTest1 {
 	public static void main(String[] args) {
	 System.out.println(3+5.0);
	 int f1 = 20, f2 = 5; 
	System.out.println(f1 + " + " + f2 + " = " + (f1 + f2 ));
	 System.out.println(f1 + " - " + f2 + " = " + (f1 - f2 ));
 	System.out.println(f1 + " * " + f2 + " = " + (f1 * f2 ));
	 System.out.println(f1 + " / " + f2 + " = " + (f1 / f2 ));
     System.out.println(f1 + " % " + f2 + " = " + (f1 % f2 ));
 }
}

📌 주요 개념: 자동(묵시적) 형변환 (Implicit Type Conversion)

  1. System.out.println(3 + 5.0);
    • 정수형 3(int)과 실수형 5.0(double)이 더해질 때, 자동 형변환(Widening Conversion)이 발생한다.
    • int → double 형변환이 이루어져서 3.0 + 5.0 = 8.0이 출력됨.
    • 📌 작은 범위(int)의 값이 큰 범위(double)로 자동 변환됨.
  2. 문자열과 숫자 연산 (f1 + " + " + f2 + " = " + (f1 + f2))
    • f1 + " + " + f2 + " = "에서 f1과 f2는 정수형(int)이지만, 문자열과 만나면서 자동으로 문자열로 변환됨.
    • "20 + 5 = " → 이후 (f1 + f2)가 연산된 값 25와 결합되어 최종 "20 + 5 = 25"가 출력됨.
  3. 산술 연산 (덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산)
    • f1 / f2 → 20 / 5는 정수형 연산이므로 결과도 **정수형(4)**으로 출력됨.
    • f1 % f2 → 20 % 5는 나머지를 구하는 연산으로, 나머지가 0이므로 0이 출력됨.

2️⃣ ArithmeticOpTest2.java 분석

public class ArithmeticOpTest2 {
	public static void main(String[] args) {
 	char ch1, ch2;
 	ch1 = 'H';  // 72
 	ch2 = 'E'; // 69
 	System.out.println(ch1 + ch2);
	System.out.println(""+ ch1 + ch2);  // 
	System.out.println(ch1 + ch2 + "");
	int intOpnd1 = 10, intOpnd2 = 20;
	double doubleOpnd = 20.0;
    
	System.out.println("10 / 20 = " + intOpnd1 / intOpnd2);
	System.out.println("10 / 20.0 = " + intOpnd1 / doubleOpnd);
	System.out.println("10 % 20 = " + intOpnd1 % intOpnd2);
	System.out.println("10 % 20.0 = " + intOpnd1 % doubleOpnd);
	 }
 }

📌 주요 개념: 문자형(char)의 형변환, 정수형/실수형 연산

  1. System.out.println(ch1 + ch2);
    • char ch1 = 'H'(유니코드 값 72), char ch2 = 'E'(유니코드 값 69)
    • ch1 + ch2 = 72 + 69 = 141 → char는 내부적으로 정수형(int)으로 저장되므로 덧셈 연산 시 int 연산이 수행됨.
  2. System.out.println("" + ch1 + ch2);
    • ""(빈 문자열)가 앞에 있으면, 자동으로 문자열 변환이 일어남.
    • "" + 'H' → "H", "H" + 'E' → "HE" 출력됨.
  3. System.out.println(ch1 + ch2 + "");
    • ch1 + ch2가 먼저 실행되어 141이 되고, 뒤의 ""(문자열)와 결합되어 **"141"**이 출력됨.
  4. 정수형과 실수형 연산
    • System.out.println("10 / 20 = " + intOpnd1 / intOpnd2);
      • 10 / 20은 정수형 연산이므로 0이 출력됨 (몫만 남음).
    • System.out.println("10 / 20.0 = " + intOpnd1 / doubleOpnd);
      • int(10)과 double(20.0)을 나누면 자동으로 double 형변환이 발생하여 0.5 출력됨.
    • System.out.println("10 % 20 = " + intOpnd1 % intOpnd2);
      • 10 % 20은 나머지를 계산하는 연산자로, 결과는 10.
    • System.out.println("10 % 20.0 = " + intOpnd1 % doubleOpnd);
      • int % double 연산이므로 double로 변환되고, 결과는 10.0.

🔍 정리: 자바 형변환 개념

  1. 자동 형변환(Widening Conversion)
    • 작은 크기의 자료형에서 큰 크기의 자료형으로 변환할 때 자동으로 형변환됨.
    • int → double, char → int 등의 변환이 가능.
    • 3 + 5.0 → 3.0 + 5.0 = 8.0 (int → double 변환)
  2. 강제(명시적) 형변환(Narrowing Conversion)
    • 큰 크기의 자료형에서 작은 크기의 자료형으로 변환할 때 명시적으로 형변환해야 함.
    • double → int 변환 시 (int) 3.7 → 3 (소수점 버려짐).
  3. 문자형(char)의 연산
    • char는 내부적으로 유니코드 값(int)으로 저장됨.
    • char + char → int 연산 ('H' + 'E' = 72 + 69 = 141).
  4. 문자열 연산
    • 문자열과 숫자를 더하면 자동으로 문자열 변환이 일어남.
    • "" + 'H' + 'E' → "HE" (문자열 변환)
    • 'H' + 'E' + "" → 141 (정수 연산 후 문자열 변환)
  5. 정수형과 실수형 연산
    • 정수형끼리 나누면 소수점이 버려짐 (10 / 20 = 0).
    • 정수형과 실수형을 연산하면 자동으로 실수형 변환 (10 / 20.0 = 0.5).
    • int % double → double 변환됨 (10 % 20.0 = 10.0).

🚀 결론

  • Java에서는 연산 시 자동 형변환이 발생하며, 연산의 결과에 따라 자료형이 결정된다.
  • 작은 자료형 → 큰 자료형 변환은 자동(Widening), 큰 자료형 → 작은 자료형 변환은 명시적(Narrowing) 형변환이 필요하다.
  • char는 내부적으로 int로 저장되며, 연산 시 정수형으로 취급된다.
  • 문자열 연산 시, 숫자도 문자열로 변환될 수 있으므로 연산 순서에 주의해야 한다.

자료형 추가실습

1️⃣ RelationalOpTest.java 분석 (관계 연산자)

public class RelationalOpTest {
    public static void main(String[] args) {
        int first = 10, second = 20;
        System.out.format("%d > %d is %b \n", first, second, (first > second));
        System.out.format("%d >= %d is %b \n", first, second, (first >= second));
        System.out.format("%d < %d is %b \n", first, second, (first < second));
        System.out.format("%d <= %d is %b \n", first, second, (first <= second));
        System.out.format("%d == %d is %b \n", first, second, (first == second));
        System.out.format("%d != %d is %b \n", first, second, (first != second));
    }
}

📌 주요 개념: 관계 연산자 (Relational Operators)

관계 연산자는 두 값을 비교하여 true 또는 false 값을 반환한다.

연산자 의미 결과
> 크다 10 > 20 → false
>= 크거나 같다 10 >= 20 → false
< 작다 10 < 20 → true
<= 작거나 같다 10 <= 20 → true
== 같다 10 == 20 → false
!= 같지 않다 10 != 20 → true

출력 결과:

10 > 20 is false
10 >= 20 is false
10 < 20 is true
10 <= 20 is true
10 == 20 is false
10 != 20 is true

2️⃣ LogicalOpTest.java 분석 (논리 연산자)

public class LogicalOpTest {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        System.out.println("true && true : " + (true && true));
        System.out.println("true && false : " + (true && false));
        System.out.println("false && true : " + (false && true));
        System.out.println("false && false  :" + (false && false));

        System.out.println("true || true : " + (true || true));
        System.out.println("true || false : " + (true || false));

        int iValue = 10;
        if((iValue % 3 == 0) && (iValue % 2 == 0)) {
            System.out.println(iValue + "은 3의 배수이고 2의 배수다");
        }
        if((iValue % 5 == 0) && (iValue % 2 == 0))
            System.out.println(iValue + "은 5의 배수이고 2의 배수다");
    }
}

📌 주요 개념: 논리 연산자 (Logical Operators)

논리 연산자는 참(true) 또는 거짓(false)을 조합하여 논리적인 판단을 수행하는 연산자이다.

연산자의미결과
연산자 의미 결과
&& 논리 AND 둘 다 true일 때만 true
`   `
! 논리 NOT true → false, false → true

출력 결과:

true && true : true
true && false : false
false && true : false
false && false  :false

true || true : true
true || false : true

🔹 논리 연산자 활용 예시

  • iValue % 3 == 0 && iValue % 2 == 0
    • 10 % 3 == 1 (false), 10 % 2 == 0 (true) → false
  • iValue % 5 == 0 && iValue % 2 == 0
    • 10 % 5 == 0 (true), 10 % 2 == 0 (true) → true → "10은 5의 배수이고 2의 배수다" 출력

3️⃣ LogicalOperator.java 분석 (비교 연산 & 논리 연산자 조합)

public class LogicalOperator {
    public static void main (String[] args) {
        // 비교 연산
        System.out.println('a' > 'b'); 
        System.out.println(3 >= 2);    
        System.out.println(-1 < 0);    
        System.out.println(3.45 <= 2); 
        System.out.println(3 == 2);    
        System.out.println(3 != 2);    
        System.out.println(!(3 != 2)); 

        // 비교 연산과 논리 연산 복합
        System.out.println((3 > 2) && (3 > 4)); 
        System.out.println((3 != 2) || (-1 > 0)); 
        System.out.println((3 != 2) ^ (-1 > 0));  
    }
}

📌 주요 개념: 비교 연산과 논리 연산 조합

  1. System.out.println('a' > 'b');
    • 'a'의 유니코드 값(97)과 'b'의 유니코드 값(98) 비교 → false
  2. !(3 != 2)
    • 3 != 2는 true → !true는 false
  3. (3 > 2) && (3 > 4)
    • 첫 번째 조건 true, 두 번째 조건 false → false
  4. (3 != 2) || (-1 > 0)
    • 첫 번째 조건 true, 두 번째 조건 false → true
  5. (3 != 2) ^ (-1 > 0)
    • XOR 연산 (true와 false가 다르면 true) → true

4️⃣ UnaryOpTest.java 분석 (단항 연산자)

public class UnaryOpTest {
    public static void main(String[] args) {
        int prefix = 100, postfix = 50;
        System.out.println("++(unary) prev: " + ++prefix);
        System.out.println("++(unary) after: " + prefix);
        System.out.println("(unary)++ prev : " + postfix++);
        System.out.println("(unary)++ after : " + postfix);
    }
}

📌 주요 개념: 단항 연산자 (Unary Operators)

연산자의미설명
연산자 의미 설명
++var 전위 증가 먼저 1 증가한 후 사용
var++ 후위 증가 사용한 후 1 증가

출력 결과 분석

  1. ++prefix
    • prefix = 100에서 ++prefix 실행 → 101
    • 출력: "++(unary) prev: 101"
    • 이후 prefix = 101 유지
  2. postfix++
    • postfix = 50에서 postfix++ 실행
    • 현재 값(50)을 먼저 사용한 후 증가
    • 출력: "(unary)++ prev : 50"
    • 이후 postfix = 51로 증가

📌 결론

🔹 1. 관계 연산자(Relational Operators)

  • >, <, >=, <=, ==, !=을 이용해 두 값을 비교하여 true 또는 false를 반환.

🔹 2. 논리 연산자(Logical Operators)

  • && (AND), || (OR), ! (NOT) 사용하여 논리적인 판단 수행.

🔹 3. 비트 논리 연산자(Logical Operators)

  • & (AND), | (OR), ^ (XOR), ~ (NOT) 사용하여 논리적인 판단 수행.

🔹 4. 비교 & 논리 연산 조합

  • 비교 연산자와 논리 연산자를 함께 사용하여 복잡한 조건 판별 가능.

🔹 5. 단항 연산자(Unary Operators)

  • ++var (전위 증가), var++ (후위 증가)의 동작 차이를 이해해야 함.

🔹 추가 : equals와 ==알아보기

예제코드

 public class equalsEx {
 public static void main(String[] args) {
 String str1 = new String("hello"); // newString()을 사용해각각다른객체를생성했기때문에false
 String str2 = new String("hello");
 System.out.println(str1 == str2); // false (다른 객체)
 String str3 = "hello";  // 문자열리터럴"hello"는StringPool에저장되므로, str3과str4는같은객체를참조하여true
 String str4 = "hello";
 System.out.println(str3 == str4); // true (같은 주소)
 }
 }
public class equalsEx {
 public static void main(String[] args) {
 String str1 = new String("hello");
 String str2 = new String("hello");
 System.out.println(str1 == str2); // false (다른 객체)
 String str3 = "hello";
 String str4 = "hello";
 System.out.println(str3 == str4); // true (같은 주소)
 String str5 = new String("hello");
 String str6 = new String("hello");

 System.out.println(str5.equals(str6)); //true (값이 동일) equals()는 두 문자열의 내용을 비교하므로 true.
 }
 }

📌 String의 특징과 new 키워드의 역할

1️⃣ new 키워드와 객체 생성

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false
  • new String("hello")를 사용하면 Heap 메모리에 새로운 String 객체를 생성한다.
  • 즉, str1과 str2는 서로 다른 메모리 주소를 참조하기 때문에 str1 == str2는 false가 된다.

2️⃣ String 리터럴과 String Pool

String str3 = "hello";
String str4 = "hello";
System.out.println(str3 == str4); // true
  • "hello"는 String Pool이라는 특별한 공간에 저장된다.
  • "hello"라는 동일한 문자열이 이미 String Pool에 존재하면, 새로운 객체를 만들지 않고 기존의 객체를 참조한다.
  • 따라서 str3과 str4는 같은 메모리 주소를 가지므로 str3 == str4는 true가 된다.

3️⃣ equals() 메서드의 역할

String str5 = new String("hello");
String str6 = new String("hello");

System.out.println(str5.equals(str6)); // true
  • equals() 메서드는 객체의 메모리 주소가 아니라 "값"을 비교한다.
  • str5와 str6은 서로 다른 객체이지만, 내부의 문자열 값 "hello"는 동일하므로 str5.equals(str6)는 true가 된다.

📌 ==와 equals()의 차이점

비교방식 == 연산자 equals() 메서드
비교 대상 메모리 주소 문자열 값
적용 대상 객체 참조 비교 문자열 내용 비교
사용 예시 str1 == str2 str1.equals(str2)
결과 (Heap 메모리에서 new로 생성) false (다른 객체) true (동일한 내용)
결과 (String Pool) true (같은 객체) true (동일한 내용)

📌 언제 ==을 사용하고, 언제 equals()을 사용할까?

== 사용 시기:

  • 객체의 **참조 주소(같은 객체인지)**를 비교할 때 사용.
  • 즉, 동일한 메모리 주소를 가리키는지 확인하는 용도로 적합.

equals() 사용 시기:

  • 두 개의 String 객체가 실제 같은 문자열 값을 가지고 있는지 비교할 때 사용.
  • new String()을 사용해 생성한 객체끼리는 ==가 false가 나오므로 equals()를 사용해야 한다.

📌 결론

  • new 키워드를 사용하면 Heap 메모리에 새로운 객체가 생성되므로 == 비교 시 false가 나올 확률이 높다.
  • String 리터럴("hello")을 사용하면 String Pool에서 동일한 값을 공유하므로 == 비교 시 true가 될 수 있다.
  • 따라서 객체의 내용이 같은지를 비교하려면 equals()를 사용해야 한다. 🚀

'computing' 카테고리의 다른 글

20250401_OS5  (0) 2025.04.01
20250331_DB4  (0) 2025.03.31
20250325_OS4  (1) 2025.03.25
20250324_DB3  (2) 2025.03.24
AndroidStudio 알아보기 [app-manifest-AndroidManifest.xml]  (2) 2025.03.20