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
메소드의 특징
- 반사성(Reflexive): 어떤 객체 x에 대해,
x.equals(x)
는 항상true
여야 함. - 대칭성(Symmetric): 어떤 객체 x와 y에 대해,
x.equals(y)
가true
라면y.equals(x)
도true
여야 함. - 추이성(Transitive): 어떤 객체 x, y, z에 대해,
x.equals(y)
가true
이고y.equals(z)
가true
라면,x.equals(z)
도true
여야 함. - 일관성(Consistent): 어떤 객체 x와 y에 대해, 변경되지 않는 객체에 대해서는
x.equals(y)
의 결과가 여러 번 호출되어도 항상 같아야 함. 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
를 반환하게 함.
equals
와 hashCode
equals
를 오버라이드할 때는 hashCode
도 함께 오버라이드해야 한다. 이는 equals
로 비교가 true
인 두 객체가 같은 해시 코드를 반환해야 하는 해시 기반 컬렉션(예: HashMap
, HashSet
)의 계약을 준수하기 위함이다.
요약
equals
메소드는 객체의 내용 비교를 위해 사용되며, ==
와 달리 객체의 논리적 동등성을 확인할 수 있다. 클래스에 따라 equals
의 작동 방식이 달라질 수 있으므로, 사용자 정의 클래스에서는 이를 적절히 오버라이드하여 사용해야 한다.