Java / / 2024. 7. 1. 17:06

자바 프로그래밍 핵심 개념 이해하기

 

1. 메서드 오버로딩 (Method Overloading)

 

자바에서 메서드 오버로딩은 동일한 이름의 메서드를 여러 개 정의하는 것을 의미합니다. 이때 각 메서드는 서로 다른 매개변수의 타입, 개수, 순서 등을 가집니다. 메서드 오버로딩을 통해 코드의 가독성과 재사용성을 높일 수 있습니다.

 

public class Example {
    // 두 정수를 더하는 메서드
    public int add(int a, int b) {
        return a + b;
    }

    // 세 정수를 더하는 메서드
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 두 실수를 더하는 메서드
    public double add(double a, double b) {
        return a + b;
    }
}

 

2. 제어 흐름 문 (Control Flow Statements)

 

2.1 if-else 문

public class SwitchDemo {
    public static void main(String[] args) {
        int month = 20;
        if (month == 1) {
            System.out.println("January");
        } else if (month == 2) {
            System.out.println("February");
        } else if (month == 3) {
            System.out.println("March");
        } // 계속...
        else {
            System.out.println("잘못된 값입니다.");
        }
    }
}

 

2.2 switch 문과 Fall-Through

 

switch 문은 가능한 여러 실행 경로 중 하나를 선택할 수 있습니다. Fall-through는 break 문이 없을 때 발생하며, 다음 case가 계속 실행됩니다.

 

public class SwitchDemoFallThrough {
    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths = new java.util.ArrayList<>();
        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            // ... (중략)
            case 12: futureMonths.add("December"); break;
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
                System.out.println(monthName);
            }
        }
    }
}

 

3. 반복문 (Loops)

 

3.1 for 문

public class EnhancedForDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.printf("i : %d, j : %d \n", i, j);
            }
        }
    }
}

 

3.2 while 문과 do-while 문

// 무한 루프 예제
public class InfiniteLoop {
    public static void main(String[] args) {
        // while문을 이용한 무한 루프
        while (true) {
            // 반복 작업 수행
        }

        // for문을 이용한 무한 루프
        for (; ; ) {
            // 반복 작업 수행
        }
    }
}
public class DoWhileDemo {
    public static void main(String[] args) {
        int number = 3;
        do {
            System.out.println("Number is: " + number);
            number--;
        } while (number > 0);
    }
}

 

4. 배열 (Array)

 

배열은 동일한 타입의 여러 요소를 저장할 수 있는 자료구조입니다.

int[] numbers = new int[5];  // 배열 선언
int[] moreNumbers = {1, 2, 3, 4, 5};  // 배열 초기화

// 배열 순회
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = i * 2;
}

// 인헨스드 for 문
for (int num : moreNumbers) {
    System.out.println(num);
}

 

5. 클래스와 객체 지향 프로그래밍 (OOP)

 

5.1 클래스 정의와 객체 생성

class Person {
    int age;
    String name;

    void introduce() {
        System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "John";
        person.age = 30;
        person.introduce();
    }
}

 

5.2 생성자 (Constructor)

class Person {
    int age;
    String name;

    // 기본 생성자
    Person() {
        this.name = "Unknown";
        this.age = 0;
    }

    // 매개변수를 받는 생성자
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void introduce() {
        System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
    }
}

 

5.3 static 키워드

 

클래스 변수와 메서드: static으로 선언된 변수나 메서드는 클래스 레벨에서 사용되며, 객체를 생성하지 않고도 접근할 수 있습니다.

class MathUtils {
    static final double PI = 3.14159;

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

public class Main {
    public static void main(String[] args) {
        System.out.println("PI: " + MathUtils.PI);
        System.out.println("Sum: " + MathUtils.add(5, 10));
    }
}

 

6. 자바의 데이터 타입

 

6.1 기본형 (Primitive Types)

 

정수형: byte, short, int, long

부동 소수점형: float, double

문자형: char

논리형: boolean

 

6.2 참조형 (Reference Types)

 

클래스: 예: String, Person

배열: 예: int[], String[]

인터페이스: 예: Runnable

 

6.3 박싱과 언박싱

 

자바는 기본형과 대응되는 래퍼 클래스(wrapper class)를 제공합니다. 예를 들어, intInteger, floatFloat과 대응됩니다.

int num = 5;
Integer boxedNum = num;  // 오토박싱
int unboxedNum = boxedNum;  // 오토언박싱

 

7. 조건문 요약

 

if-else: 조건에 따라 코드 블럭을 실행합니다.

switch: 여러 가능한 실행 경로 중 하나를 선택합니다.

 

8. 반복문 요약

 

for: 정해진 횟수만큼 반복합니다.

while: 조건이 참인 동안 반복합니다.

do-while: 조건이 참인지 검사하기 전에 한 번 실행됩니다.

 

9. 이중 반복문과 continue

 

이중 반복문: 반복문 안에 또 다른 반복문을 중첩하여 사용할 수 있습니다.

continue: 반복문에서 현재 반복을 건너뛰고 다음 반복으로 진행합니다.

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) {
            continue;
        }
        System.out.println("i: " + i + ", j: " + j);
    }
}

 

10. 배열 순회와 인헨스드 for 문

 

배열의 각 요소에 접근하기 위해 반복문을 사용합니다. 인헨스드 for 문을 사용하면 배열을 더욱 간단하게 순회할 수 있습니다.

int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
    System.out.println(num);
}

 

11. 메소드

 

메소드: 특정 기능을 수행하기 위한 코드의 묶음.

접근제어자 반환형 메소드명(전달값) 형태로 정의.

메소드 오버로딩: 같은 이름을 가진 메소드를 매개변수의 타입, 개수, 순서 등을 달리하여 여러 개 정의.

 

12. 클래스와 인스턴스

 

 클래스 변수: static 키워드를 사용하여 선언되며, 클래스 전체에서 공유됩니다. 객체를 생성하지 않고도 클래스명으로 접근할 수 있습니다.

class Person {
    static int population = 0; // 클래스 변수

    Person() {
        population++;
    }
}

public class Main {
    public static void main(String[] args) {
        new Person();
        new Person();
        System.out.println("Population: " + Person.population);
    }
}

 

인스턴스 변수: 클래스 내에 선언된 변수로, 각각의 객체가 개별적으로 가지는 변수입니다.

class Person {
    String name; // 인스턴스 변수
    int age;     // 인스턴스 변수

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void introduce() {
        System.out.println("Hi, I'm " + name + " and I'm " + age + " years old.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice", 30);
        Person person2 = new Person("Bob", 25);

        person1.introduce();
        person2.introduce();
    }
}

 

클래스 메소드: static 키워드를 사용하여 정의된 메소드로, 객체를 생성하지 않고 클래스명으로 호출할 수 있습니다.

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

public class Main {
    public static void main(String[] args) {
        int sum = MathUtils.add(5, 10);
        System.out.println("Sum: " + sum);
    }
}

 

인스턴스 메소드: 클래스의 인스턴스에서 호출할 수 있는 메소드로, 객체의 상태를 변경하거나 정보를 제공하는 데 사용됩니다.

class Person {
    String name;

    void setName(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Charlie");
        System.out.println(person.getName());
    }
}

 

this 키워드: 현재 인스턴스 자체를 참조하는 키워드로, 주로 인스턴스 변수와 지역 변수를 구분할 때 사용됩니다.

class Person {
    String name;

    Person(String name) {
        this.name = name; // this를 사용하여 인스턴스 변수와 지역 변수 구분
    }
}

 

13. 배열 (Array)와 반복문

 

배열 선언과 초기화: 배열은 같은 타입의 데이터를 저장할 수 있는 자료 구조입니다.

int[] numbers = new int[5];  // 크기가 5인 정수형 배열 선언
numbers[0] = 10;             // 배열의 첫 번째 요소에 값 할당

int[] moreNumbers = {1, 2, 3, 4, 5};  // 배열 초기화

 

배열 순회: 반복문을 사용하여 배열의 모든 요소에 접근할 수 있습니다.

for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

 

인헨스드 for: 배열이나 컬렉션을 간단하게 순회할 수 있는 반복문입니다.

int[] numbers = {1, 2, 3, 4, 5};

for (int num : numbers) {
    System.out.println(num);
}

 

14. 제어문 요약

 

if-else: 조건에 따라 다른 코드 블록을 실행합니다.

int a = 10;
if (a > 5) {
    System.out.println("a는 5보다 큽니다.");
} else {
    System.out.println("a는 5보다 작거나 같습니다.");
}

 

switch: 여러 실행 경로 중 하나를 선택할 수 있습니다.

int month = 3;
switch (month) {
    case 1: System.out.println("January"); break;
    case 2: System.out.println("February"); break;
    case 3: System.out.println("March"); break;
    // 계속...
    default: System.out.println("Invalid month");
}

 

for: 반복 횟수가 정해져 있을 때 사용합니다.

for (int i = 0; i < 5; i++) {
    System.out.println("i: " + i);
}

 

while: 조건이 참일 때 반복합니다.

int i = 0;
while (i < 5) {
    System.out.println("i: " + i);
    i++;
}

 

do-while: 최소 한 번 실행된 후 조건을 평가합니다.

int i = 0;
do {
    System.out.println("i: " + i);
    i++;
} while (i < 5);

 

15. 이중 반복문과 continue 문

 

이중 반복문: 반복문 안에 또 다른 반복문을 넣어 중첩하여 사용합니다.

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        System.out.println("i: " + i + ", j: " + j);
    }
}

 

continue: 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.

for (int i = 0; i < 5; i++) {
    if (i == 2) {
        continue; // i가 2일 때 반복을 건너뜁니다.
    }
    System.out.println("i: " + i);
}

 

16. 메소드 (Method)

 

메소드 정의: 특정 기능을 수행하는 코드의 묶음으로, 반환형 메소드명(매개변수) 형식으로 정의됩니다.

public void sayHello() {
    System.out.println("Hello!");
}

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

 

메소드 오버로딩: 같은 이름의 메소드를 매개변수의 타입, 개수, 순서를 다르게 하여 여러 개 정의할 수 있습니다.

public int multiply(int a, int b) {
    return a * b;
}

public double multiply(double a, double b) {
    return a * b;
}

 

17. 자바의 데이터 타입 요약

 

기본형 데이터 타입: int, long, float, double, char, boolean 등.

참조형 데이터 타입: 클래스, 인터페이스, 배열 등 객체의 참조를 저장합니다.

박싱과 언박싱: 기본형 데이터를 객체로, 객체 데이터를 기본형으로 변환하는 과정입니다.

int num = 5;
Integer boxedNum = num;  // 오토박싱
int unboxedNum = boxedNum;  // 오토언박싱

 

이와 같은 정리를 통해 자바 프로그래밍의 기본적인 개념을 체계적으로 이해할 수 있으며, 실습을 통해 이러한 개념들을 적용할 수 있습니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유