Post

java 공부 2024.05.07

배열

일반변수가 하나의 단일 공간이라면, 배열은 일련의 공간을 여러칸으로 나눈것.

자바에서 배열이 파이썬의 리스트.

int[] 처럼 배열공간과 데이터타입정의.

1
2
3
4
5
6
7
8
9
10
11
12
package learnJava;

public class JAVALEARN {
    public static void main(String[] args) {
        String[] names = {"sam", "kate", "john", "jenny"};
        
        System.out.println(names[0]);
        System.out.println(names[1]);
        System.out.println(names[2]);
        System.out.println(names[3]);
   }
}

배열 읽고 쓰기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package learnJava;

public class JAVALEARN {
    public static void main(String[] args) {
        // 각 월별 판매량을 저장할 배열 생성
        int[] sales = new int[5];
        
        // 각 월별 판매량 데이터 입력
        sales[0] = 52;  // 1월 판매량
        sales[1] = 50;  // 2월 판매량
        sales[2] = 55;  // 3월 판매량
        sales[3] = 42;  // 4월 판매량
        sales[4] = 38;  // 5월 판매량
        
        // 전체 판매량 계산
        int sum = sales[0] +  sales[1] +  sales[2] + sales[3] +  sales[4];
        
        // 총 판매량 출력
        System.out.printf("총 판매량: %d잔", sum);
    }
}

인덱스 범위

범위 벗어난 접근은 에러를 발생시킴 -> 프로그램 비정상 종료됨

파이썬에서 list[-1] 로 음수 접근해서 마지막요소를 가져올 수 있는데 java에서는 음수 인덱스 사용이 안됨.

1
2
3
4
int[] array = {1, 2, 3, 4, 5};
int lastIndex = array.length - 1;
int lastElement = array[lastIndex];
System.out.println("마지막 요소: " + lastElement);

대신 이런식으로 배열의 마지막 요소에 접근가능.

배열과 반복문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package learnJava;

public class JAVALEARN {
    public static void main(String[] args) {
        // 배열 초기화: 학생들의 점수를 저장하는 배열
        int[] arr = {88, 76, 92, 68, 55, 48, 82};
        int sum = 0; // 총점을 저장할 변수 초기화
        
        // 배열의 모든 요소를 반복하여 총점 계산
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i]; // 현재 학생의 점수를 총점에 더함
        }
        
        // 총점 출력
        System.out.printf("총점: %d", sum);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package learnJava;

public class JAVALEARN {
    public static void main(String[] args) {
        // 각 주간의 운동 시간을 분 단위로 저장하는 배열 초기화
        int[] runningM = {42, 66, 57, 54, 88, 64, 71};
        int sum = 0; // 총합을 저장할 변수 초기화
        
        // 배열의 모든 요소를 반복하여 총합 계산
        for (int i = 0; i < runningM.length; i++) {
            sum += runningM[i]; // 현재 주간의 운동 시간을 총합에 더함
        }        
        
        // 평균 계산
        double avg = (double) sum / runningM.length;
        
        // 총합과 평균 출력
        System.out.printf("총합: %d분\n", sum);
        System.out.printf("평균: %d분 %.0f초\n", (int) avg, 60 * (avg % 1));
    }
}

배열 활용

배열은 메소드의 입력변수로 전달도 가능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package learnJava;
// learnJava 패키지에 JAVALEARN 클래스를 정의합니다.
// 이 클래스는 짝수 배열과 소수 배열의 합을 계산하여 출력하는 기능을 제공합니다.
public class JAVALEARN {
    
    // main 메서드: 프로그램의 시작점입니다.
    public static void main(String[] args) {
        // 짝수 배열 초기화
        int[] evens = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
        // 소수 배열 초기화
        int[] primes = {2, 3, 5, 7, 11, 13, 17, 19};
        
        // 짝수 배열의 합 계산
        int evenSum = sum(evens);
        // 소수 배열의 합 계산
        int primeSum = sum(primes);

        // 짝수 배열의 합 출력
        System.out.printf("짝수 배열의 합: %d\n", evenSum);
        // 소수 배열의 합 출력
        System.out.printf("소수 배열의 합: %d\n", primeSum);
    }
    
    // sum 메서드: 배열의 합을 계산하는 메서드입니다.
    // 매개변수로 int 형 배열을 받습니다.
    // 이 메서드는 외부에서 접근 가능하며, 클래스에 속하는 정적 메서드입니다.
    // 메서드의 이름은 sum이며, 이는 배열의 합을 계산하는 기능을 수행합니다.
    public static int sum(int[] arr) {
        int sum = 0; // 합을 저장할 변수를 초기화합니다.
        
        // 배열의 모든 요소를 반복하여 합을 계산합니다.
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i]; // 현재 요소를 합에 더합니다.
        }
        
        return sum; // 계산된 합을 반환합니다.
    }
}

sum이라는 메소드에 배열을 전달.

다차원배열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package learnJava;

// learnJava 패키지에 JAVALEARN 클래스를 정의합니다.
// 이 클래스는 구구단을 계산하여 출력하는 기능을 제공합니다.
public class JAVALEARN {
    
    // main 메서드: 프로그램의 시작점입니다.
    public static void main(String[] args) {
        // 2차원 배열 ggdan을 생성합니다. 각 요소는 구구단의 결과를 저장합니다.
        int[][] ggdan = new int[10][10];
        
        // 이중 반복문을 사용하여 구구단을 계산하고 출력합니다.
        for (int i = 2; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                ggdan[i][j] = i * j; // 각 요소에 구구단의 결과를 저장합니다.
                // 결과를 출력합니다.
                System.out.printf("%d x %d = %d\n", i, j, ggdan[i][j]);
                //System.out.println(ggdan[i][j]);

            }
            System.out.println();
        }
    }
}

다차원배열 개념 링크

객체지향

객체 지향 프로그래밍

객체지향 예제 이미지

클래스 설계와 구현

클래스 생성 예제 이미지

객체의 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package learnJava;

// learnJava 패키지에 Cat 클래스를 정의합니다.
// 이 클래스는 고양이에 관한 정보를 저장하고 출력하는 기능을 제공합니다.
public class Cat {
    String name; // 고양이의 이름을 저장하는 변수
    String breeds; // 고양이의 품종을 저장하는 변수
    double weight; // 고양이의 체중을 저장하는 변수
    
    // claw 메서드: 고양이의 할퀴기 동작을 나타내는 메서드
    void claw() {
        System.out.println("할퀴기");
    }
    
    // meow 메서드: 고양이의 야옹 소리를 나타내는 메서드
    void meow() {
        System.out.println("야옹");
    }
    
    // main 메서드: 프로그램의 시작점입니다.
    public static void main(String[] args) {
        // Cat 클래스의 객체를 생성합니다.
        Cat  c = new Cat();
        
        // 고양이의 정보를 설정합니다.
        c.name = "네로";
        c.breeds = "페르시안";
        c.weight = 4.37;
        
        // 고양이의 정보를 출력합니다.
        System.out.printf("이름: %s\n", c.name);
        System.out.printf("품종: %s\n", c.breeds);
        System.out.printf("체중: %.2fkg\n", c.weight);
    }
}

객체의 활용 이미지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package learnJava;
//Dog 클래스: 개에 관한 정보를 저장하고 출력하는 기능을 제공합니다.
public class Dog {
 String name; // 개의 이름을 저장하는 변수
 String breeds; // 개의 품종을 저장하는 변수
 int age; // 개의 나이를 저장하는 변수
 
 // wag 메서드: 개의 꼬리를 살랑살랑 흔들어주는 동작을 나타내는 메서드
 void wag() {
     // 개의 이름과 함께 꼬리를 살랑살랑 흔들어주는 메시지를 출력합니다.
     System.out.printf("[%s] 살랑살랑 !\n", name);
 }
 
 // bark 메서드: 개의 짖는 소리를 나타내는 메서드
 void bark() {
     // 개의 이름과 함께 멍멍하는 메시지를 출력합니다.
     System.out.printf("[%s] 멍멍 !\n", name);
 }
 
 // bark 메서드 (오버로딩): 개의 짖는 소리를 나타내는 메서드로, 특정 횟수만큼 반복해서 짖는 기능을 제공합니다.
 // 매개변수로 반복 횟수를 받습니다.
 void bark(int times) {
     // 개의 이름과 짖는 소리를 반복 횟수만큼 출력합니다.
     String sound = "컹컹!";
     System.out.printf("[%s] %s (x%d)\n", name, sound, times);
 }
 
 // main 메서드: 프로그램의 시작점입니다.
 public static void main(String[] args) {
     // Dog 클래스의 객체를 생성합니다.
     Dog d1 = new Dog();
     Dog d2 = new Dog();
     
     // 각 개의 정보를 설정합니다.
     d1.name = "망고";
     d1.breeds = "골든리트리버";
     d1.age = 2;
     d2.name = "까미";
     d2.breeds = "믹스";
     d2.age = 3;
     
     // 각 개의 정보를 출력합니다.
     System.out.printf("d1 => { %s, %s, %d세}\n", d1.name, d1.breeds, d1.age);
     System.out.printf("d2 => { %s, %s, %d세}\n", d2.name, d2.breeds, d2.age);
     
     // 각 개에 대해 특정 동작을 수행합니다.
     d1.wag();
     d2.bark();
     d1.bark(3);
 }
}

생성자

생성자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package learnJava;
//Dog 클래스: 개에 관한 정보를 저장하고 출력하는 기능을 제공합니다.
public class Dog {
 String name; // 개의 이름을 저장하는 변수
 String breeds; // 개의 품종을 저장하는 변수
 int age; // 개의 나이를 저장하는 변수
 
 // wag 메서드: 개의 꼬리를 살랑살랑 흔들어주는 동작을 나타내는 메서드
 void wag() {
     // 개의 이름과 함께 꼬리를 살랑살랑 흔들어주는 메시지를 출력합니다.
     System.out.printf("[%s] 살랑살랑 !\n", name);
 }
 
 // bark 메서드: 개의 짖는 소리를 나타내는 메서드
 void bark() {
     // 개의 이름과 함께 멍멍하는 메시지를 출력합니다.
     System.out.printf("[%s] 멍멍 !\n", name);
 }
 
 // bark 메서드 (오버로딩): 개의 짖는 소리를 나타내는 메서드로, 특정 횟수만큼 반복해서 짖는 기능을 제공합니다.
 // 매개변수로 반복 횟수를 받습니다.
 void bark(int times) {
     // 개의 이름과 짖는 소리를 반복 횟수만큼 출력합니다.
     String sound = "컹컹!";
     System.out.printf("[%s] %s (x%d)\n", name, sound, times);
 }
 
 // main 메서드: 프로그램의 시작점입니다.
 public static void main(String[] args) {
     // Dog 클래스의 객체를 생성합니다.
     Dog d1 = new Dog();
     Dog d2 = new Dog();
     
     // 각 개의 정보를 설정합니다.
     d1.name = "망고";
     d1.breeds = "골든리트리버";
     d1.age = 2;
     d2.name = "까미";
     d2.breeds = "믹스";
     d2.age = 3;
     
     // 각 개의 정보를 출력합니다.
     System.out.printf("d1 => { %s, %s, %d세}\n", d1.name, d1.breeds, d1.age);
     System.out.printf("d2 => { %s, %s, %d세}\n", d2.name, d2.breeds, d2.age);
     
     // 각 개에 대해 특정 동작을 수행합니다.
     d1.wag();
     d2.bark();
     d1.bark(3);
 }
}

생성자명은 클래스이름과 같아야함 (중요)

main이 있는 클래스는 파일명과 클래스이름이 같아야하는데 그 안에 클래스를 만들 수 있음 (내부클래스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package today0507;

// HeroTest 클래스: Hero 클래스의 객체를 생성하고 정보를 출력하는 테스트를 수행합니다.
public class HeroTest {
    public static void main(String[] args) {
        // Hero 객체를 생성하고 초기화합니다.
        Hero ironMan = new Hero("아이언맨", 100, 120);
        Hero hulk = new Hero("헐크", 200, 80);
        
        // 각 Hero 객체의 정보를 출력합니다.
        System.out.println(ironMan.toStr());
        System.out.println(hulk.toStr());
    }
}

// Hero 클래스: 영웅의 이름, 파워, 스피드를 저장하고 출력하는 기능을 제공합니다.
class Hero {
    String name; // 영웅의 이름을 저장하는 변수
    int power; // 영웅의 파워를 저장하는 변수
    int speed; // 영웅의 스피드를 저장하는 변수

    // Hero 클래스의 생성자: 이름, 파워, 스피드를 초기화합니다.
    Hero(String n, int p, int s) {
        name = n;
        power = p;
        speed = s;
    }
    
    // toStr 메서드: Hero 객체의 정보를 문자열로 반환합니다.
    String toStr() {
        return String.format("Hero(name: %s, power: %d, speed: %d)", name, power, speed);
    }
}

System.out.println(ironMan.toStr());

System.out.println(hulk.toStr());

아이언맨으로 만든 생성자의 toStr메서드를 호출. 헐크는 헐크.

과제

깃허브 링크

배운것

확장된 switch (Java 12 이상의 switch expression)

switch 기본 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
javaCopy code
switch (expression) {
    case value1:
        // value1과 일치할 때 실행되는 코드
        break;
    case value2:
        // value2와 일치할 때 실행되는 코드
        break;
    // 더 많은 case들을 추가할 수 있음
    default:
        // 어떤 case도 일치하지 않을 때 실행되는 코드
}

확장된 switch

Java 12부터는 switch가 표현식으로도 사용될 수 있어 값을 직접 반환할 수 있다. 이 형태에서는 ->를 사용하여 각 case의 결과를 지정할 수 있으며, 여러 줄의 실행이 필요한 경우 {}로 블록을 만들 수 있음.

1
2
3
4
5
6
7
8
9
javaCopy code
int day = 5;
String dayType = switch (day) {
    case 1, 2, 3, 4, 5 -> "Weekday";
    case 6, 7 -> "Weekend";
    default -> "Invalid day";
};
System.out.println(dayType);

이렇게 switch 문은 자바에서 중요한 조건 분기 도구로, 복잡한 if-else 구조를 보다 명확하게 표현할 수 있게 해 줌.

equals

자바의 equals 메소드는 두 객체의 내용이 같은지 비교하는 데 사용. == 연산자와는 달리, equals는 객체의 메모리 주소가 아닌, 객체의 실제 내용을 비교.

기본 사용법

Object 클래스에 정의된 equals 메소드는 기본적으로 객체의 참조를 비교(즉, ==와 동일하게 작동). 하지만 대부분의 자바 클래스에서는 equals 메소드를 오버라이드(재정의)하여 객체의 실제 내용을 비교하도록 함.

1
2
3
public boolean equals(Object obj) {
    // 여기에 비교 로직 구현
}

equals 메소드와 == 연산자의 차이

  • == 연산자: 두 참조 변수가 같은 객체를 가리키고 있는지 확인. 즉, 두 객체의 주소를 비교.
  • equals 메소드: 두 객체의 내용이 같은지 비교. 클래스에 따라 내용 비교 방식이 다를 수 있다.

예제 코드

1
2
3
4
5
6
String a = new String("hello");
String b = new String("hello");

System.out.println(a == b); // false, because a and b are not the same object
System.out.println(a.equals(b)); // true, because a and b have the same content

equals 메소드의 특징

  1. 반사성(Reflexive): 어떤 객체 x에 대해, x.equals(x)는 항상 true여야 함.
  2. 대칭성(Symmetric): 어떤 객체 x와 y에 대해, x.equals(y)true라면 y.equals(x)true여야 함.
  3. 추이성(Transitive): 어떤 객체 x, y, z에 대해, x.equals(y)true이고 y.equals(z)true라면, x.equals(z)true여야 함.
  4. 일관성(Consistent): 어떤 객체 x와 y에 대해, 변경되지 않는 객체에 대해서는 x.equals(y)의 결과가 여러 번 호출되어도 항상 같아야 함.
  5. null에 대한 비-동등성: 모든 객체 x에 대해, x.equals(null)false여야 함.

주요 클래스에서의 equals

  • String 클래스: 내용(문자열 값)이 같은 경우 true를 반환한다.
  • Integer와 같은 래퍼 클래스: 값이 같을 경우 true를 반환한다.
  • 사용자 정의 클래스: 개발자가 equals 메소드를 오버라이드하여 내용 비교를 구현해야 한다.

equals 메소드 오버라이드 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }
}

사용자 정의 클래스에서 equals 사용하기

사용자 정의 클래스에서 equals를 오버라이드할 때는 주로 객체의 핵심 필드를 비교. 이는 객체가 논리적으로 같다고 판단될 때 true를 반환하게 함.

equalshashCode

equals를 오버라이드할 때는 hashCode도 함께 오버라이드해야 한다. 이는 equals로 비교가 true인 두 객체가 같은 해시 코드를 반환해야 하는 해시 기반 컬렉션(예: HashMap, HashSet)의 계약을 준수하기 위함이다.

요약

equals 메소드는 객체의 내용 비교를 위해 사용되며, ==와 달리 객체의 논리적 동등성을 확인할 수 있다. 클래스에 따라 equals의 작동 방식이 달라질 수 있으므로, 사용자 정의 클래스에서는 이를 적절히 오버라이드하여 사용해야 한다.

This post is licensed under CC BY 4.0 by the author.