728x90
반응형

Java의 클래스와 객체란

Java는 객체지향 프로그래밍(OOP)을 기반으로 하는 언어로, 클래스(Class)와 객체(Object)가 핵심 개념입니다. 클래스를 설계도로 생각하면, 객체는 그 설계도로 만들어진 실체라고 볼 수 있습니다.

class Car {
    String brand;
    int speed;
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car(); // 객체 생성
        myCar.brand = "Tesla";
        myCar.speed = 100;
        System.out.println(myCar.brand + "의 속도: " + myCar.speed);
    }
}

1. 클래스란

클래스는 객체를 생성하기 위한 청사진(템플릿) 역할을 합니다. 클래스 내부에는 필드(멤버 변수)와 메서드(함수)가 포함될 수 있습니다.

class Animal {
    String name;
    void makeSound() {
        System.out.println("소리를 냅니다.");
    }
}

2. 캡슐화 (Encapsulation)

캡슐화는 객체의 데이터(필드)를 외부에서 직접 접근하지 못하도록 숨기고, 필요한 경우 메서드를 통해 접근하도록 하는 개념입니다.

class BankAccount {
    private int balance;

    public void deposit(int amount) {
        balance += amount;
    }

    public int getBalance() {
        return balance;
    }
}

캡슐화를 사용하는 이유

  • 데이터 보호
  • 코드 유지보수성 향상
  • 객체 간 결합도를 낮춰 유연한 설계 가능

3. 추상화 (Abstraction)

추상화는 불필요한 세부 사항을 숨기고, 객체의 핵심 기능만 노출하는 개념입니다.

abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("멍멍!");
    }
}

추상화를 사용하는 이유

  • 복잡성을 줄이고 코드 가독성을 높임
  • 유지보수가 쉬운 구조 설계 가능

4. 생성자 (Constructor)

생성자는 객체가 생성될 때 자동으로 호출되는 메서드입니다.

class Car {
    String brand;
    int speed;

    // 생성자
    Car(String brand, int speed) {
        this.brand = brand;
        this.speed = speed;
    }
}

5. 오버로딩 (Overloading)

오버로딩은 같은 이름의 메서드를 매개변수의 개수나 타입을 다르게 하여 여러 개 정의하는 기법입니다.

class MathUtil {
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }
}

6. static과 final 키워드

1. static 키워드

static 키워드는 클래스 수준에서 공유되는 변수나 메서드를 정의할 때 사용합니다.

class Counter {
    static int count = 0;
}

2. final 키워드

final 키워드는 한 번 할당된 값이 변경되지 않도록 할 때 사용합니다.

final class Constants {
    static final double PI = 3.14159;
}
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 상속  (0) 2025.02.28
[Java] 객체 배열  (0) 2025.02.27
[Java] 배열  (0) 2025.02.27
[Java] 제어문  (0) 2025.02.27
[Java] 메소드와 API  (0) 2025.02.26
728x90
반응형

Java 배열이란

Java에서 배열(Array)은 동일한 타입의 여러 값을 저장할 수 있는 자료 구조입니다. 배열을 활용하면 데이터를 효율적으로 관리하고 반복문과 함께 사용할 수 있어 코드의 간결성과 실행 속도를 높일 수 있습니다.

1. 배열의 개요

배열(Array)은 연속된 메모리 공간에 요소를 저장하며, 인덱스를 이용해 접근할 수 있습니다. Java에서 배열은 new키워드를 사용하여 생성됩니다.

int[] numbers = new int[5]; // 크기가 5인 정수형 배열 선언
  • 고정된 크기: 배열의 크기는 생성 시 결정되며 이후 변경할 수 없습니다.
  • 동일한 데이터 타입: 배열에는 같은 타입의 데이터만 저장할 수 있습니다.
  • 인덱스 기반 접근: 배열 요소는 0부터 시작하는 인덱스를 통해 접근합니다.

2. 배열 선언 및 초기화

1. 배열 선언

// 선언과 동시에 크기 할당
int[] arr1 = new int[3];

// 선언과 동시에 값 할당
int[] arr2 = {1, 2, 3, 4, 5};

2. 배열 값 접근 및 변경

int[] numbers = {10, 20, 30};
System.out.println(numbers[1]); // 20 출력

numbers[1] = 50;
System.out.println(numbers[1]); // 50 출력

3. 배열의 복사

1. for 문을 이용한 복사

int[] original = {1, 2, 3, 4, 5};
int[] copy = new int[original.length];

for (int i = 0; i < original.length; i++) {
    copy[i] = original[i];
}

2. System.arraycopy() 메서드 사용

int[] original = {1, 2, 3, 4, 5};
int[] copy = new int[original.length];
System.arraycopy(original, 0, copy, 0, original.length);

3. Arrays.copyOf() 메서드 사용

import java.util.Arrays;
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, original.length);

4. 배열의 정렬

1. 순차 정렬 (Sequential Sort)

import java.util.Arrays;
int[] numbers = {5, 3, 8, 1, 2};
Arrays.sort(numbers);


2. 선택 정렬 (Selection Sort)

public static void selectionSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}


3. 버블 정렬 (Bubble Sort)

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}


4. 삽입 정렬 (Insertion Sort)

public static void insertionSort(int[] arr) {
    int n = arr.length;
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

5. 다차원 배열

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

System.out.println(matrix[1][2]); // 6 출력
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 객체 배열  (0) 2025.02.27
[Java] 클래스와 객체  (2) 2025.02.27
[Java] 제어문  (0) 2025.02.27
[Java] 메소드와 API  (0) 2025.02.26
[Java] 연산자  (0) 2025.02.26
728x90
반응형

Java 제어문이란

Java에서 **제어문(Control Statements)**은 코드의 실행 흐름을 제어하는 데 사용됩니다. 이를 통해 프로그램이 특정 조건에 따라 동작하도록 만들거나 반복 실행할 수 있습니다. 제어문은 크게 세 가지 유형으로 나뉩니다.

  • 조건문 (Conditional Statements): 특정 조건을 만족할 때 코드 블록을 실행합니다.
  • 반복문 (Loop Statements): 특정 조건이 충족될 때까지 코드 블록을 반복 실행합니다.
  • 분기문 (Branching Statements): 코드의 실행 흐름을 변경합니다.

1. 조건문 (Conditional Statements)

조건문은 프로그램이 특정 조건을 만족할 때만 실행되는 코드 블록을 정의하는 데 사용됩니다.

1. if문

  • if 문은 가장 기본적인 조건문이며, 주어진 조건이 true일 경우 실행됩니다.
int number = 10;
if (number > 0) {
    System.out.println("양수입니다.");
}

2. if-else 문

  • 조건이 false일 때 실행할 코드 블록을 추가할 수 있습니다.
int number = -5;
if (number > 0) {
    System.out.println("양수입니다.");
} else {
    System.out.println("음수입니다.");
}

3. else if 문

  • 여러 개의 조건을 검사해야 할 때 else if를 사용할 수 있습니다.
int score = 85;
if (score >= 90) {
    System.out.println("A 학점");
} else if (score >= 80) {
    System.out.println("B 학점");
} else {
    System.out.println("C 학점");
}

4. switch 문

  • switch 문은 특정 변수의 값에 따라 여러 개의 코드 블록 중 하나를 실행합니다.
int day = 3;
switch (day) {
    case 1:
        System.out.println("월요일");
        break;
    case 2:
        System.out.println("화요일");
        break;
    case 3:
        System.out.println("수요일");
        break;
    default:
        System.out.println("기타 요일");
}

2. 반복문 (Loop Statements)

반복문은 특정 조건이 충족될 때까지 코드 블록을 반복 실행할 수 있도록 합니다.

1. for 문

  • for 문은 반복 횟수가 정해져 있을 때 사용됩니다.
for (int i = 1; i <= 5; i++) {
    System.out.println("반복: " + i);
}

2. while 문

  • while 문은 조건이 true인 동안 반복 실행됩니다.
int i = 1;
while (i <= 5) {
    System.out.println("반복: " + i);
    i++;
}

3. do-while 문

  • do-while 문은 최소 한 번 실행된 후, 조건이 true 인지 검사합니다.
int i = 1;
while (i <= 5) {
    System.out.println("반복: " + i);
    i++;
}

3. 분기문 (Branching Statements)

분기문은 코드의 실행 흐름을 변경하는 데 사용됩니다.

1. break 문

  • break 문은 반복문을 즉시 종료합니다.
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println("반복: " + i);
}

2. continue 문

  • continue 문은 현재 반복을 건너뛰고 다음 반복으로 이동합니다.
for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;
    }
    System.out.println("반복: " + i);
}

3. return 문

  • return 문은 현재 메서드의 실행을 종료하고 값을 반환합니다.
public static int add(int a, int b) {
    return a + b;
}

4. 간단한 Java 제어문 예제

import java.util.Scanner;

public class ControlExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("점수를 입력하세요: ");
        int score = scanner.nextInt();

        if (score >= 90) {
            System.out.println("A 학점입니다.");
        } else if (score >= 80) {
            System.out.println("B 학점입니다.");
        } else {
            System.out.println("C 학점입니다.");
        }
    }
}
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 클래스와 객체  (2) 2025.02.27
[Java] 배열  (0) 2025.02.27
[Java] 메소드와 API  (0) 2025.02.26
[Java] 연산자  (0) 2025.02.26
[Java] 변수  (0) 2025.02.26
728x90
반응형

1. 메소드 (Method)

메소드는 특정 작업을 수행하는 코드 블록으로, 코드의 재사용성과 가독성을 높이는 역할을 합니다.

 

메소드의 구조

public class MethodExample {
    // 메소드 선언
    public static int add(int a, int b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        int result = add(5, 10);
        System.out.println("결과: " + result);
    }
}
  • 매개변수(Parameter): 메소드가 실행될 때 전달되는 값
  • 반환값(Return Value): 메소드 실행 후 결과 값 반환
  • 오버로딩(Method Overloading): 같은 이름의 메소드를 여러 개 정의 가능 (매개변수 다름)
public static int add(int a, int b) {
    return a + b;
}

public static double add(double a, double b) {
    return a + b;
}

2. 패키지 (Package)

패키지는 관련된 클래스들을 그룹화하는 개념으로, 코드의 유지보수를 용이하게 합니다.

패키지 선언 방법

Java 소스 파일의 첫 줄에 package 키워드를 사용하여 선언합니다.

package mypackage;

public class MyClass {
    public static void main(String[] args) {
        System.out.println("패키지 예제");
    }
}
  • java.lang: 기본적인 Java 클래스 (자동 포함)
  • java.util: 유틸리티 클래스 (컬렉션, 날짜 등)
  • java.io: 입출력 관련 클래스
  • java.net: 네트워크 프로그래밍 관련 클래스

3. 임포트 (Import)

다른 패키지에 있는 클래스를 사용하려면 import 문을 이용해야 합니다.

import java.util.Scanner;

public class ImportExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("숫자 입력: ");
        int number = scanner.nextInt();
        System.out.println("입력한 숫자: " + number);
    }
}

import 문 없이 사용하는 방법

클래스의 전체 경로를 직접 지정하면 import 없이 사용 가능합니다.

public class NoImportExample {
    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        System.out.println("Hello, Java");
    }
}

4. API (Application Programming Interface)

API는 미리 작성된 클래스 및 메소드 모음으로, 개발자가 쉽게 사용할 수 있도록 제공됩니다.

자주 사용하는 Java API

  • java.lang : 기본적인 클래스 (String, Math 등)
  • java.util : 컬렉션 프레임워크, 날짜 및 시간
  • java.io : 파일 입출력 관련 기능
  • java.net : 네트워크 관련 기능
  • java.sql : 데이터베이스 연결 및 조작
import java.util.ArrayList;

public class ApiExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("API");
        System.out.println(list);
    }
}
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 배열  (0) 2025.02.27
[Java] 제어문  (0) 2025.02.27
[Java] 연산자  (0) 2025.02.26
[Java] 변수  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
728x90
반응형

Java 연산자란

Java 연산자(Operator)는 프로그램에서 데이터를 처리하고 값을 연산하는 데 사용됩니다. Java에는 여러 종류의 연산자가 있으며, 이를 활용하면 효율적인 프로그래밍이 가능합니다. 이 글에서는 산술 연산자, 대입 연산자, 증감 연산자, 비교 연산자, 논리 연산자, 삼항 연산자까지 상세히 알아보겠습니다.

1. Java 연산자 개요

연산자는 연산을 수행하는 기호 또는 키워드입니다. Java에서는 다양한 연산자를 제공하며, 대표적으로 아래와 같은 유형이 있습니다.

  • 산술 연산자 : +, -, *, /, % (사칙연산 및 나머지
  • 대입 연산자 : =, +=, -=, *=, /=, %=
  • 증감 연산자 : ++, -- (값을 1 증가/감소)
  • 비교 연산자 : ==, !=, >, <, >=, <= (두 값 비교)
  • 논리 연산자 : &&, ||, !, &, ^, ~
  • 삼항 연산자 : 조건 ? 값1 : 값2 (if-else 대체)

2. Java 산술 연산자 (Arithmetic Operators)

산술 연산자는 수학적 계산을 수행하는 연산자입니다.

  • + : 덧셈
  • - : 뺄셈
  • * : 곱셈
  • / : 나눗셈
  • % : 나머지
public class ArithmeticExample {
    public static void main(String[] args) {
        int a = 10, b = 3;
        System.out.println("덧셈: " + (a + b));
        System.out.println("뺄셈: " + (a - b));
        System.out.println("곱셈: " + (a * b));
        System.out.println("나눗셈: " + (a / b));
        System.out.println("나머지: " + (a % b));
    }
}

3. Java 대입 연산자 (Assignment Operators)

대입 연산자는 변수에 값을 할당하는 연산자입니다.

  • = : 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함
  • += : 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함
  • -= : 왼쪽의 피연산자에 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함
  • *= : 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함
  • /= : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함
  • %= : 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입
int a = 10;
a += 5; // a = 15
a -= 3; // a = 12
a *= 2; // a = 24
a /= 4; // a = 6
a %= 3; // a = 0

4. Java 증감 연산자 (Increment & Decrement Operators)

증감 연산자는 변수의 값을 1 증가 또는 감소시키는 연산자입니다.

  • ++var : 피연산자의 값을 먼저 1을 증가시킨 후 다른 연산을 진행함
  • var++ : 다른 연산을 먼저 진행하고 난 뒤 마지막에 피연산자의 값을 1 증가시킴
  • --var : 피연산자의 값을 먼저 1 감소 시킨 후 다른 연산을 진행함
  • var-- : 다른 연산을 먼저 진행하고 난 뒤 마지막에 피연산자의 값을 1 감소시킴
int x = 5;
System.out.println(x++); // 출력: 5 (이후 x=6)
System.out.println(++x); // 출력: 7

5. Java 비교 연산자 (Comparison Operators)

비교 연산자는 두 값을 비교하여 true 또는 false를 반환합니다.

  • == : 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 true 다르면 false를 반환
  • != : 왼쪽의 피연산자와 오른쪽의 피연산자가 다르면 true 같으면 false를 반환
  • > : 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 true 아니면 false를 반환
  • >= : 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 true 아니면 false를 반환
  • < : 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 true 아니면 false를 반환
  • <= : 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 true 아니면 false를 반환

6. Java 논리 연산자 (Logical Operators)

논리 연산자는 논리적인 조건을 평가할 때 사용됩니다.

  • && : 두 개의 논리식 모두 참 일 경우 참을 반환, 둘 중 한 개라도 거짓인 경우 거짓을 반환하는 연산자이다.(AND)
  • || : 두 개의 논리식 중 둘 중 하나라도 참 일 경우 참을 반환, 둘 다 모두 거짓일 경우 거짓을 반환한다.(OR)
  • ! : 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환한다.(NOT

7. Java 삼항 연산자 (Ternary Operator)

삼항 연산자는 if-else 문을 간결하게 표현할 때 사용됩니다.

// 변수 = (조건) ? 값1 : 값2;

int age = 18;
String result = (age >= 18) ? "성인" : "미성년자";
System.out.println(result); // 출력: 성인
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 제어문  (0) 2025.02.27
[Java] 메소드와 API  (0) 2025.02.26
[Java] 변수  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
[JAVA] StringBuilder / StringBuffer 클래스  (1) 2025.02.13
728x90
반응형

Java 변수란

Java에서 변수는 데이터를 저장하는 메모리 공간을 의미합니다. 변수는 프로그램이 실행되는 동안 값을 변경할 수 있으며, 다양한 데이터 타입을 가질 수 있습니다. 이 글에서는 Java 변수의 기본 개념부터 리터럴, 상수, 오버플로우, 형변환까지 자세히 알아보겠습니다.

1. Java 리터럴 (Literals)

리터럴(Literal)은 변수에 저장할 고정된 값을 의미합니다. 예를 들어, 숫자 100, 문자 'A', 문자열 "Hello" 같은 값들이 리터럴입니다.

리터럴의 종류

  • 정수 리터럴: 10, 0b1010(이진수), 012(8진수), 0xA(16진수)
  • 실수 리터럴: 3.14, 2.0e3 (2.0 × 10³)
  • 문자 리터럴: 'A', '1'
  • 문자열 리터럴: "Hello World"
  • 논리 리터럴: true, false
int number = 100; // 정수 리터럴
char letter = 'A'; // 문자 리터럴
String text = "Hello"; // 문자열 리터럴
boolean flag = true; // 논리 리터럴

2. Java 변수 (Variables)

변수는 데이터를 저장하고 관리하는 역할을 합니다. Java에서 변수를 선언할 때는 데이터 타입과 변수명을 지정해야 합니다.

int age = 25; // 정수형 변수
double pi = 3.14; // 실수형 변수
String name = "Java"; // 문자열 변수

변수의 종류

  1. 지역 변수 (Local Variable): 메서드 내부에서 선언된 변수로, 해당 메서드 내에서만 사용 가능.
  2. 멤버 변수 (Instance Variable): 클래스 내부에서 선언되며, 객체 생성 후 사용 가능.
  3. 클래스 변수 (Static Variable): static 키워드를 사용하여 선언된 변수로, 모든 객체가 공유.

3. Java 상수 (Constants)

상수(Constant)는 한 번 값이 할당되면 변경할 수 없는 변수입니다. Java에서는 final 키워드를 사용하여 선언합니다.

final double PI = 3.14159;
final int MAX_VALUE = 100;

 

상수를 사용할 때의 장점

  • 프로그램의 가독성이 좋아짐
  • 실수로 값을 변경하는 오류 방지
  • 유지보수성이 향상됨

4. Java 오버플로우 (Overflow)

오버플로우(Overflow)는 변수의 저장 범위를 초과하는 경우 발생합니다.

public class OverflowExample {
    public static void main(String[] args) {
        byte b = 127; // byte의 최대값
        b++; // 오버플로우 발생
        System.out.println(b); // -128 출력 (값이 순환)
    }
}

오버플로우 방지 방법

  • 보다 큰 데이터 타입 사용 (int → long, byte → int 등)
  • 예외 처리 및 값의 범위 확인

5. Java 형변환 (Type Casting)

형변환(Type Casting)이란, 변수의 데이터 타입을 변경하는 과정입니다. Java에서는 자동 형변환 강제 형변환이 있습니다.

자동 형변환 (Implicit Casting)

작은 데이터 타입에서 큰 데이터 타입으로 변환 시 자동으로 수행됩니다.

int num = 10;
double d = num; // 자동 형변환 (int → double)

강제 형변환 (Explicit Casting)

큰 데이터 타입에서 작은 데이터 타입으로 변환할 때는 (타입)을 명시해야 합니다.

double d = 9.78;
int num = (int) d; // 강제 형변환 (double → int)

형변환 시 주의할 점

  • 데이터 손실 가능성 (double → int 변환 시 소수점 제거됨)
  • 범위를 초과하면 오버플로우 발생 가능
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 메소드와 API  (0) 2025.02.26
[Java] 연산자  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
[JAVA] StringBuilder / StringBuffer 클래스  (1) 2025.02.13
[JAVA] Wrapper 클래스  (0) 2025.02.13
728x90
반응형

1. Math 클래스

자바에서 수학적 연산을 다루는 다양한 정적 메서드들을 제공한다.

이 클래스는 인스턴스화 할 수 없고, 모든 메서드는 static으로 제공되기 때문에 객체를 생성할 필요 없이 바로 사용할 수 있다.

2. 주요 메서드

  • abs()
    • 절대값을 반환합니다.
  • max()
    • 두 값 중 더 큰 값을 반환합니다.
  • min()
    • 두 값 중 더 작은 값을 반환합니다.
  • pow()
    • 첫 번째 인자(밑)를 두 번째 인자(지수)의 제곱으로 반환합니다.
  • sqrt()
    • 제곱근을 반환합니다.
  • random()
    • 0.0 이상 1.0 미만의 임의의 실수 값을 반환합니다.
  • round()
    • 소수점을 반올림하여 가장 가까운 정수를 반환합니다.
  • ceil()
    • 주어진 숫자보다 크거나 같은 정수 중 가장 작은 값을 반환합니다.
  • floor()
    • 주어진 숫자보다 작거나 같은 정수 중 가장 큰 값을 반환합니다.
  • toDegrees()
    • 라디안을 각도로 변환합니다.
  • toRadians()
    • 각도를 라디안으로 변환합니다.
  • sin(), cos(), tan()
    • 삼각 함수들을 제공합니다. (각도는 라디안 단위)

3. Math 클래스 사용 예시

public class MathExample {
    public static void main(String[] args) {
        int absValue = Math.abs(-25);  // 절댓값
        System.out.println("절댓값: " + absValue);

        double powerValue = Math.pow(3, 2);  // 제곱
        System.out.println("3의 제곱: " + powerValue);

        double sqrtValue = Math.sqrt(25);  // 제곱근
        System.out.println("25의 제곱근: " + sqrtValue);

        double randomValue = Math.random();  // 랜덤 값
        System.out.println("랜덤 값: " + randomValue);

        long roundValue = Math.round(4.6);  // 반올림
        System.out.println("4.6 반올림: " + roundValue);

        double ceilValue = Math.ceil(3.1);  // 올림
        System.out.println("3.1 올림: " + ceilValue);

        double floorValue = Math.floor(3.7);  // 내림
        System.out.println("3.7 내림: " + floorValue);

        double tanValue = Math.tan(Math.toRadians(45));  // 탄젠트
        System.out.println("tan(45°): " + tanValue);
    }
}

4. Math 클래스 활용 예시

  • 임의의 숫자 생성 : Math.random()을 사용하여 난수를 생성할 수 있습니다.
int randomNumber = (int)(Math.random() * 100);  // 0부터 99까지 난수
System.out.println(randomNumber);
  • 최댓값과 최솟값 찾기 : Math.max()와 Math.min()을 사용하여 최댓값과 최솟값을 쉽게 찾을 수 있습니다.
int maxValue = Math.max(50, 100);  // 100
int minValue = Math.min(50, 100);  // 50
System.out.println("Max: " + maxValue + ", Min: " + minValue);
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 연산자  (0) 2025.02.26
[Java] 변수  (0) 2025.02.26
[JAVA] StringBuilder / StringBuffer 클래스  (1) 2025.02.13
[JAVA] Wrapper 클래스  (0) 2025.02.13
[JAVA] Object 클래스  (0) 2025.02.13
728x90
반응형

1. StringBuilder / StringBuffer 클래스

가변적인 문자열을 처리할 수 있는 클래스들로, 문자열을 자주 수정하거나 변경해야 하는 경우에 매우 유용하다.

String 클래스는 불변(immutable)이라 문자열을 변경하면 새 객체를 생성하기 때문에 성능상 이점이 필요할 때 두 클래스를 사용한다.

  • StringBuilder 클래스
    • 가변 문자열 클래스
    • 동기화되지 않음 (멀티스레드 환경에서의 안전성 보장 안 됨)
    • 주로 단일 스레드 환경에서 성능을 최적화하기 위해 사용
  • StringBuffer 클래스
    • 가변 문자열 클래스
    • 동기화됨 (멀티스레드 환경에서 안전하게 사용할 수 있음)
    • 성능은 StringBuilder보다 떨어짐, 그러나 멀티스레드 환경에서는 더 안전하게 사용할 수 있음

2. StringBuilder의 주요 메서드

  • append()
    • 문자열을 추가할 때 사용
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
  • insert()
    • 특정 위치에 문자열을 삽입할 때 사용
StringBuilder sb = new StringBuilder("Hello World");
sb.insert(5, " Java");
System.out.println(sb); // Hello Java World
  • delete()
    • 특정 범위의 문자열을 삭제
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11); // 5부터 11까지 삭제
System.out.println(sb); // Hello
  • reverse()
    • 문자열을 뒤집을 때 사용
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // olleH
  • toString()
    • StringBuilder를 String으로 변환
StringBuilder sb = new StringBuilder("Hello");
String str = sb.toString();
System.out.println(str); // Hello

3. StringBuffer의 주요 메서드

  • append()
    • 문자열을 추가할 때 사용
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
  • insert()
    • 특정 위치에 문자열을 삽입할 때 사용
StringBuffer sb = new StringBuffer("Hello World");
sb.insert(5, " Java");
System.out.println(sb); // Hello Java World
  • delete()
    • 특정 범위의 문자열을 삭제
StringBuffer sb = new StringBuffer("Hello World");
sb.delete(5, 11); // 5부터 11까지 삭제
System.out.println(sb); // Hello
  • reverse()
    • 문자열을 뒤집을 때 사용
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb); // olleH
  • toString()
    • StringBuffer를 String으로 변환
StringBuffer sb = new StringBuffer("Hello");
String str = sb.toString();
System.out.println(str); // Hello

4. StringBuilder와 StringBuffer 비교

특징 StringBuilder StringBuffer
동기화 동기화되지 않음 (단일 스레드 환경에 적합) 동기화됨 (멀티스레드 환경에 적합)
성능 더 빠름 (동기화가 필요 없기 때문) 상대적으로 느림 (동기화로 인한 성능 저하)
사용 권장 환경 단일 스레드 환경에서의 문자열 수정이 만을 때 멀티스테드 환경에서의 문자열 수정이 많을 때

5. StringBuilder 사용 예시

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");
        sb.insert(5, " Java");
        sb.delete(5, 9);
        sb.reverse();

        System.out.println(sb.toString());  // olleH
    }
}

6. 마무리

  1. 사용할 때의 장점
    • 문자열을 자주 수정할 때 성능상 매우 유리합니다.
    • String 클래스처럼 불변 객체를 다루는 것보다 효율적이며, 메모리 사용이 절약됩니다.
  2. 언제 사용할까
    • StringBuilder
      • 주로 단일 스레드 환경에서 성능 최적화가 필요할 때 사용한다.
    • StringBuffer
      • 멀티스레드 환경에서 여러 스레드가 문자열을 수정할 때 안전하게 사용한다.
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 변수  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
[JAVA] Wrapper 클래스  (0) 2025.02.13
[JAVA] Object 클래스  (0) 2025.02.13
[Spring] Spring Framework  (3) 2025.02.05
728x90
반응형

1. Wrapper 클래스

Wrapper 클래스는 기본형(Primitive Type) 데이터를 객체로 감싸서 사용할 수 있도록 만든 클래스입니다.

자바에서 기본형 데이터(int, double, char, boolean 등)는 객체가 아니라서 메서드를 가질 수 없지만, Wrapper 클래스를 사용하면 객체처럼 다룰 수 있고 다양한 메서드를 활용할 수 있습니다.

2. Wrapper 클래스 종류

기본형 타입 Wrapper 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

3. Wrapper 클래스 사용법

  • 기본형 -> Wrapper 객체 (박싱, Boxing)
  • valueOf() 메서드를 사용하면 기본형 데이터를 Wrapper 객체로 변환할 수 있습니다.
public class WrapperExample {
    public static void main(String[] args) {
        Integer intObj = Integer.valueOf(100); // int → Integer
        Double doubleObj = Double.valueOf(10.5); // double → Double
        Boolean boolObj = Boolean.valueOf(true); // boolean → Boolean
        
        System.out.println(intObj); // 100
        System.out.println(doubleObj); // 10.5
        System.out.println(boolObj); // true
    }
}
  • Wrapper 객체 -> 기본형 (언박싱, Unboxing)
  • intValue(), doubleValue(), booleanValue() 등의 메서드로 기본형 데이터를 꺼낼 수 있습니다.
public class WrapperExample {
    public static void main(String[] args) {
        Integer intObj = Integer.valueOf(100);
        int intValue = intObj.intValue(); // Integer → int
        double doubleValue = intObj.doubleValue(); // Integer → double

        System.out.println(intValue); // 100
        System.out.println(doubleValue); // 100.0
    }
}

4. 오토박싱 & 오토언박싱 (AutoBoxing & AutoUnboxing)

  • 오토박싱 (AutoBoxing) -> 기본형 -> Wrapper 객체 자동 변환
public class AutoBoxingExample {
    public static void main(String[] args) {
        Integer intObj = 100; // int → Integer (자동 변환)
        Double doubleObj = 10.5; // double → Double (자동 변환)

        System.out.println(intObj); // 100
        System.out.println(doubleObj); // 10.5
    }
}
  • 오토언박싱 (AutoUnBoxing) -> Wrapper 객체 -> 기본형 자동 변환
public class AutoUnboxingExample {
    public static void main(String[] args) {
        Integer intObj = 200;
        int intValue = intObj; // Integer → int (자동 변환)

        System.out.println(intValue); // 200
    }
}

5. Wrapper 클래스의 주요 메서드

  • parseXxx() -> 문자열을 기본형 데이터로 변환
public class ParseExample {
    public static void main(String[] args) {
        int num = Integer.parseInt("100"); // "100" → int 100
        double dNum = Double.parseDouble("10.5"); // "10.5" → double 10.5
        boolean bool = Boolean.parseBoolean("true"); // "true" → boolean true

        System.out.println(num); // 100
        System.out.println(dNum); // 10.5
        System.out.println(bool); // true
    }
}
  • toString() -> 기본형 데이터를 문자열로 변환
public class ToStringExample {
    public static void main(String[] args) {
        String strNum = Integer.toString(100); // int → "100"
        String strDouble = Double.toString(10.5); // double → "10.5"

        System.out.println(strNum); // "100"
        System.out.println(strDouble); // "10.5"
    }
}

6. Wrapper 클래스 사용

  • 컬렉션(List, Set, Map)에서 기본형을 제정할 때
    • ArrayList<int>는 사용할 수 없지만, ArrayList<Integer>는 가능
  • 기본형 데이터를 객체처럼 다루고 싶을 때
  • 문자열을 숫자로 변환할 때 (parseXxx() 메서드 활용)
  • 기본형 데이터를 유틸리티 기능이 필요할 때 (Integer.toBinaryString(), Double.isNaN() 등)
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 변수  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
[JAVA] StringBuilder / StringBuffer 클래스  (1) 2025.02.13
[JAVA] Object 클래스  (0) 2025.02.13
[Spring] Spring Framework  (3) 2025.02.05
728x90
반응형

1. toString()

toString() 메서드는 기본적으로 객체의 정보를 문자열로 반환하는 메서드입니다.

기본적으로 Object 클래스에서 제공하는 toString()의 구현은 다음과 같습니다.

클래스 이름 + "@" + 객체의 해시코드(16진수) 형태의 문자열을 반환합니다.

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

 

2. toString() 기본 사용 예시

class Car {}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.toString());
        System.out.println(car);  // println 내부에서 toString() 자동 호출
    }
}

/*
Car@6d06d69c
Car@6d06d69c
*/

3. toString()을 오버라이드하여 의미 있는 값 반환

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public String toString() {
        return "name: " + name + ", number: " + number;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car("Sonata", 1234);
        System.out.println(car);  // toString() 자동 호출
    }
}

/*
name: Sonata, number: 1234
*/

4. equals()

Object 클래스에서 기본적으로 제공하는 equals() 메서드는 두 객체의 참조(주소)를 비교합니다.

즉, 기본적으로 == 연산자와 동일한 동작을 합니다.

5. 기본 equals() 동작 확인

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Sonata", 1234);
        Car car2 = new Car("Sonata", 1234);
        Car car3 = car1;

        System.out.println(car1.equals(car2)); // false (기본 equals는 참조 비교)
        System.out.println(car1.equals(car3)); // true (같은 객체를 참조)
    }
}

/*
false
true
*/

6. equals() 오버라이드하여 원하는 기준으로 비교

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true; // 같은 객체이면 true
        if (obj == null || getClass() != obj.getClass()) return false; // 클래스 다르면 false

        Car car = (Car) obj; // 형 변환 후 비교
        return number == car.number && name.equals(car.name);
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Sonata", 1234);
        Car car2 = new Car("Sonata", 1234);
        Car car3 = new Car("Avante", 5678);

        System.out.println(car1.equals(car2)); // true (name과 number가 같음)
        System.out.println(car1.equals(car3)); // false (값이 다름)
    }
}

/*
true
false
*/

7. equals() 오버라이드할 때 주의할 점

  • this == obj 먼저 비교 : 같은 객체라면 바로 true 반환.
  • obj == null 체크 : null.equals(객체) 호출 시 예외 방지.
  • getClass()로 클래스 비교 : 다른 클래스라면 false 반환.
  • 형 변환 후 비교 : instanceof 대신 getClass()를 사용하면 정확한 타입 체크 가능.
  • 모든 중요한 필드 비교 : 객체가 같다고 판단할 기준을 정해야 함.

8. hashCode()와의 관계

  • equals()를 오버라이드하면 반드시 hashCode()도 함계 오버라이드해야 합니다.
  • 이유 : equals()가 같다고 판단한 두 객체는 같은 hashCode() 값을 가져야 합니다.
  • 그렇지 않으면 HashMap, HashSet 같은 컬렉션에서 정상적으로 동작하지 않습니다.

9. hashCode()

기본적으로 Object 클래스에서 제공하는 hashCode()는 객체의 메모리 주소를 기반으로 해시 값을 반환합니다.

즉, 기본적으로 각각의 객체는 서로 다른 해시코드를 가집니다.

10. 기본 hashCode() 동작 확인

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Sonata", 1234);
        Car car2 = new Car("Sonata", 1234);

        System.out.println(car1.hashCode()); // 해시코드 값
        System.out.println(car2.hashCode()); // car1과 다름 (기본적으로 다른 객체이므로)
    }
}

/*
1163157884
1956725890
*/

11. hashCode() 오버라디으하여 값이 같으면 동일한 해시코드 반환

import java.util.Objects;

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Car car = (Car) obj;
        return number == car.number && name.equals(car.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, number);
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car("Sonata", 1234);
        Car car2 = new Car("Sonata", 1234);

        System.out.println(car1.equals(car2)); // true (값 비교)
        System.out.println(car1.hashCode());  // car1과 car2의 해시코드가 같음
        System.out.println(car2.hashCode());
    }
}

/*
true
356573597
356573597
*/

12. hashCode() 구현 방법

  • Objects.hash()
@Override
public int hashCode() {
    return Objects.hash(name, number);
}
  • 직접 해시코드 계산
    • 31은 소수(prime number)로, 해시 충돌을 줄이는 데 도움을 줍니다.
@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + number;
    return result;
}

13. equals()와 hashCode()의 관계

  • equals()가 true라면 hashCode() 값도 같아야 한다.
  • hashCode()가 같다고 해서 equals()가 true라는 보장은 없다.
    • 서로 다른 객체가 우현히 같은 해시코드를 가질 수도 있음(해시 충돌).
@Override
public boolean equals(Object obj) {
    return true;  // 항상 true를 반환하는 잘못된 equals()
}

@Override
public int hashCode() {
    return 1234;  // 모든 객체의 해시코드를 같은 값으로 반환
}

14. hashCode()가 중요한 이유

컬렉션 hashCode()의 역할
HashSet 중복 요소 검사 시 사용
HashMap 키의 해시코드를 이용해 빠르게 검색
HashTable 키의 해시코드를 이용해 데이터 저장

 

import java.util.HashSet;
import java.util.Objects;

class Car {
    String name;
    int number;

    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Car car = (Car) obj;
        return number == car.number && name.equals(car.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, number);
    }
}

public class Main {
    public static void main(String[] args) {
        HashSet<Car> cars = new HashSet<>();
        cars.add(new Car("Sonata", 1234));
        cars.add(new Car("Sonata", 1234)); // 중복 요소 추가

        System.out.println(cars.size()); // 1 (중복이 제거됨)
    }
}

/*
1
*/
728x90
반응형

'이것 저것 개발 공부 > JAVA' 카테고리의 다른 글

[Java] 변수  (0) 2025.02.26
[JAVA] Math 클래스  (1) 2025.02.13
[JAVA] StringBuilder / StringBuffer 클래스  (1) 2025.02.13
[JAVA] Wrapper 클래스  (0) 2025.02.13
[Spring] Spring Framework  (3) 2025.02.05

+ Recent posts