본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 김지나 #1주차 "~List"

반응형

01장. 자바란 무엇인가?

 

✅ javac와 java

- javac: 자바 파일 컴파일 (.java 파일 컴파일 -> .class 파일 생성) 

- java: 컴파일된 .class 파일을 실행

- 자바 프로그램 실행 과정: .java 파일 작성 -> 컴파일, .class 파일 생성 -> .class 파일 실행 

 

 

✅ main

 

- main 메서드: 프로그램 실행 시작 메서드, 프로그램을 실행하려면 반드시 필요

- main 메서드를 사용하려면 이 ⬇️ 형태로 사용해야 함!!

public static void main(String[] args)

- public: 메서드의 접근 제어자, 모든 클래스에서 메소드 접근 가능

- static: 객체를 생성하지 않아도 실행 가능

- void: 리턴값 없음

- String[]: 문자열 자료형, 값 여러 개로 이루어진 배열

- args: String[] 자료형의 변수명

 

02장. 자바 시작하기

 

✅ 자바 코드의 구조

- 클래스 블록 > 메서드 블록 > 명령문

 

 

✅ 변수 알아보기

- 변수: 값을 넣을 수 있는 빈 상자, 값을 대입하여 사용 가능

 

 

✅ 자료형 알아보기

- 자료형: 프로그램에서 사용되는 데이터 유형

- int, long, double, boolean 등등 ...

 

 

✅ 이름 짓는 규칙

- 클래스: 명사, 대문자로 시작, 파스칼 케이스(각 단어의 첫 번째 글자를 대문자로! ex: HelloJava)

- 메서드: 동사, 소문자로 시작, 카멜 케이스(맨 첫 글자를 제외한 나머지 단어의 첫 글자를 대문자로! ex: getBackground)

- 변수: 직관적으로!!

 

 

03장. 자바의 기초 - 자료형

 

✅ 숫자

1) 정수

- int: -2147483648 ~ 2147483647, 4 byte, 32 bit

- long: -9223372036854775808 ~ 9223372036854775807, 8 byte, 64 bit

☆ long 변수에 값을 대입할 때 int 자료형의 최댓값을 넘은 수를 대입하고 싶다면 마지막에 L을 붙여줘야 함!! 안 그러면 오류가 날수도...

long test = 8764827384923849L; // example

 

2) 실수

- float: 4 byte, 32 bit

- double: 8 byte, 64 bit

float pi = 3.14F;
double morePi = 3.14159265358979323846;

- float 변수에 값을 대입할 때 마지막에 F를 붙여줘야 함!! 안 그러면 오류가 ........

 

3) 숫자 연산

- 기본적인 사칙연산은 +, -, *, /로 가능

- %: 나머지를 반환하는 연산자

 

4) 증감 연산

- ++, --: 각각 값을 1만큼 증가, 감소시킴

☆ 증감 연산자의 위치에 따라 결괏값이 달라짐!!!!

- i++, i--: 코드를 실행시키고 증가

- ++i, --i: 증가시키고 코드 실행

 

 

✅ 불

- boolean: 참 또는 거짓의 값을 갖는 자료형

- 조건문에서 판단을 할 때 자주 사용됨

 

 

✅ 문자

- char: 문자열 자료형

- 문자, 아스키코드, 유니코드 모두로 표현 가능

char a1 = 'a';  // 문자
char a2 = 97;  // 아스키코드
char a3 = '\u0061';  // 유니코드

System.out.println(a1);  // a 출력
System.out.println(a2);  // a 출력
System.out.println(a3);  // a 출력

 

 

✅ 문자열

1) String: 문자열 자료형

String a = "Wink Java Study";
String a = new String("WJS");

- 첫 번째 리터럴 표기 방식은 값을 그대로 대입해주는 반면 두 번째 new 키워드를 사용한 방식은 새로운 String 객체를 만들어줌

 

2) 원시 자료형

- int, long, double, float 등등의 자료형

- new 키워드를 사용할 수 없음, 리터럴 방식으로만 사용 가능

- String은 원시 자료형이 아님!!!

 

3) 문자열 내장 메소드

메소드 사용 방법 의미
equals String a = "Wink Java Study";
String b = new String("WJS");
System.out.println(a.equals(b)); 
false
문자열(a, b)이 같은지 비교하여 결괏값 리턴
indexOf a.indexOf("Study");
10
특정 문자열이 시작되는 위치 리턴
contains a.contains("Java");
true
특정 문자열의 포함 여부 리턴
charAt a.charAt(7);
v
특정 위치의 문자 리턴
replaceAll a.replaceAll("Wink", "KMU");
KMU Java Study 
특정 문자열을 다른 문자열로 바꿈
substring a.substring(0,4); ☆ 끝위치문자포함x
Wink
특정 문자열을 뽑아냄
toUpperCase a.toUpperCase();
WINK JAVA STUDY
문자열을 모두 대문자로 변경
split String a = "w:i:n:k";
String [] result = a.split(":");
{"w", "i", "n", "k"} 배열 생성
특정 구분자로 나누어 문자열 배열로 리턴

 

4) 문자열 포매팅

- 문자열 포매팅: 문자열 안의 특정 값을 삽입하는 것

- String.format 메소드 사용

 

① 숫자 바로 대입하기

- 문자열 내에서 숫자를 넣고 싶은 부분에 %d, 삽입할 숫자를 파라미터로 전달

System.out.println(String.format("I eat %d chips.", 1000));
 // "I eat 1000 chips." 출력

 

② 문자열 바로 대입하기

- 포맷 코드 %s 사용

System.out.println(String.format("I eat %s chips.", "million"));
// "I eat million chips." 출력

 

③ 숫자값을 나타내는 변수 대입하기

- 변수명을 파라미터로 전달

int number = 2000;
System.out.println(String.format("I eat %d chips", number));

 

④ 값을 2개 이상 넣기

- 파라미터 순서대로 전달하기

int number = 1000;
String emo = "happy";
System.out.println(String.format("I ate %d chips. So I was %s.", number, emo));
// I ate 1000 chips. So I was happy.

 

5) 문자열 포맷 코드

- %s는 전달되는 파라미터의 값을 자동으로 문자열로 변환하여 사용

- 문자열 포맷 코드와 특수 문자 '%' 문자를 동시에 사용하고 싶다면 '%%'로 사용

- 포맷 코드를 숫자와 함께 사용한다면 정렬, 공백, 소수점 표현 가능

 

6) String.format vs System.out.printf

- String.format: 문자열 리턴 메소드, 출력되지 않음 

- System.out.printf: 문자열 출력 메소드

 

 

✅ StringBuffer

- StringBuffer: 문자열 추가, 변경 시 주로 사용하는 자료형

- StringBuffer를 사용하는 이유

: String은 연산자로 문자열을 추가할 때마다 객체의 개수가 하나씩 늘어나지만 StringBuffer는 객체를 한 번만 생성함

: String은 값을 한 번 생성하면 변경 불가, StringBuffer는 변경 가능

- 하지만 무조건 StringBuffer가 좋은 것은 아니다...!! StringBuffer는 무거워서 메모리 사용량도 많고 속도도 느림... 🐷

따라서 문자열을 추가하거나 삽입할 일이 많다면 StringBuffer를, 아니면 String을 사용하도록 하자!!!

 

1) append

- 문자열 추가 

StringBuffer a = new StringBuffer();
a.append("Wink");
a.append(" ");
a.append("Java Study");
String result = a.toString(); // toString() 메소드를 사용하여 String 자료형으로 변경
System.out.println(result);
// Wink Java Study

 

2) insert

- 문자열 삽입

StringBuffer a = new StringBuffer();
a.append("Java Study");
a.insert(0, "Wink ");
System.out.println(a.toString());
// Wink Java Study

 

3) substring

- StringBuffer 객체 내에서 특정 문자열을 뽑아냄

 

 

✅ 배열

- 자료형의 집합

int [] evens = {2, 4, 6, 8, 10};
String [] animals = {"돼지", "대지", "도애지", "돼징"};
// 배열 생성

 

1) 배열의 길이 설정하기

String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

- 초깃값 없이 배열을 만들 때는 길이를 설정해 줘야 함. 안 하면 오류 발생!!

 

2) 배열값에 접근하기

- 인덱스 이용

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[5]);
// 토

 

3) 배열의 길이 구하기

- length: 길이 메소드

int [] evens = {2, 4, 6, 8, 10};
int len = evens.length;
System.out.println(len);
// 5

 

4) 배열 오류

- ArrayIndexOutOfBoundsException: 배열 길이 외의 값을 요구하면 오류

 

 

✅ 리스트

- 배열과 비슷하지만, 동적이고 다양한 타입의 데이터 저장 가능

 

1) ArrayList

- import java.util.ArrayList;를 사용해서 패키지를 불러와야 함

메소드 사용 방법 의미
add ArrayList evens = new ArrayList();
evens.add("4");
evens.add("6");
evens.add("8");
evens.add(0, "2"); 첫번째 위치에 2 추가
요솟값 추가
get evens.get(1);
4
특정 인덱스의 값 추출
size  evens.size();
4
요소 개수 추출
contains evens.contains("4");
true
리스트 안에 그 값이 있는지 판별해 boolean으로 리턴
remove(객체) evens.remove("8");
true
객체에 해당하는 값을 삭제한 뒤, 그 결과로 true 또는 false 리턴
remove(인덱스) evens.remove(0);
2
인덱스에 해당하는 값을 삭제한 뒤, 그 값을 리턴

 

2) 제네릭스

- 자료형을 더 명확하게 체크할 수 있음

- ArrayList evens = new ArrayList(); → ArrayList<String> evens = new ArrayList<>();

- 제네릭스를 사용하지 않으면 리스트에 추가하는 객체를 Object 자료형으로 인식하는데, 나중에 값을 가져올 때 매번 형 변환을 해야 해서 번거로움 

 

3) 다양한 방법으로 ArrayList 만들기

- asList 메소드를 사용하여 문자열 배열을 리스트로 만들기

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        String[] data = {"2", "4", "6"}; // 배열 존재
        ArrayList<String> evens = new ArrayList<>(Arrays.asList(data));
        System.out.println(evens);  // [2, 4, 6] 출력
    }
}

 

- String 자료형 여러 개를 전달하여 리스트 생성하기

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> evens = new ArrayList<>(Arrays.asList("2", "4", "6"));
        System.out.println(evens);
    }
}

 

4) String.join

- 리스트의 각 요소를 구분자로 구분해서 하나의 문자열로 만들기

- String.join("구분자", 리스트 객체)

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> evens = new ArrayList<>(Arrays.asList("2", "4", "6"));
        String result = String.join(",", evens);
        System.out.println(result);  // 2, 4, 6 출력
    }
}

 

5) 리스트 정렬하기

- 오름차순 정렬: Comparator.naturalOrder()

- 내림차순 정렬: Comparator.reverseOrder()

 

 


1주차 퀴즈

Q1. 다음 중 int 자료형의 크기는?

A1. c) 32비트

 

Q2. Java에서 소수점이 있는 실수형 데이터를 저장하기 위해 사용하는 자료형은?

A2. c) float

 

Q3. double 자료형과 float 자료형의 차이점은 무엇인가?

A3. b) double은 64비트, float은 32비트이다.

 

Q4. 다음 중 boolean 자료형이 가질 수 있는 값은?

A4. a) true와 false

 

Q5. 다음 중 boolean 값을 반환하는 메서드는?

A5. a) isEmpty()

 

Q6. 다음 중 boolean 표현식을 적절히 사용하는 경우는?

A6. b) boolean y = true;

 

Q7. 다음 중 문자열을 상수 풀(String Pool)에 저장하는 방법은?

A7. b) "example"

 

Q8. 다음 중 문자열 길이를 반환하는 메서드는?

A8. a) length()

 

Q9. 다음 코드의 출력 결과는 무엇인가?

String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2);

A9. b) false

 

Q10. Java에서 배열의 길이를 얻기 위해 사용하는 속성은?

A10. c) length

 

Q11. 다음 중 Java에서 다차원 배열을 선언하는 올바른 문법은?

A11. b) int [] [] arr = new int[2][2];

 

Q12. 배열에 초기값 없이 선언된 int 배열의 기본값은?

A12. a) 0 (String 배열은 초기값 없이 선언하면 오류가 나지만 int 배열은 초기값 없이 선언하면 int 값의 default 값(0)으로 초기화됨) 

 

Q13. 배열의 인덱스는 몇부터 시작하는가?

A13. a) 0

 

Q14.  다음 코드의 출력 결과는?

int[] arr = {1, 2, 3, 4};
System.out.println(arr[2]);

A14. c) 3

 

Q15. Java에서 List 인터페이스를 구현한 클래스가 아닌 것은?

A15. c) HashSet

 

Q16. 다음 중 ArrayList의 기본적인 특징은 무엇인가?

A16. c) 임의 접근이 가능하다.

 

Q17. List에서 요소를 추가할 때 사용하는 메소드는?

A17. c) add()

 

Q18. 다음 코드의 출력 결과는 무엇인가?

List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.get(1));

A18. b) Python 

 

Q19. List의 요소를 반복하기 위해 사용할 수 있는 방법인 것은?

A19. d) 모두 맞음

 

서술형 문제

Q1. Java에서 기본 자료형(primitive types)과 참조 자료형(reference types)의 차이점에 대해 설명하시오.

A1. 기본 자료형은 변수가 실제로 값을 가지는 자료형을 뜻하며 int, long, double 등이 있고 리터럴 방식으로만 사용이 가능하다. 참조 자료형은 실제로 값을 가지지 않고 객체를 참조하는 변수를 뜻하며 String, ArrayList 등이 있고 new 키워드를 사용할 수 있다.

 

Q2. 숫자형 자료형 간의 형 변환(예: int에서 double로 변환)이 발생할 때의 주의사항을 설명하시오.

A2. 정수와 실수에 주의하여야 한다. int는 정수지만 double은 부동소수점으로 표현되는 실수기 때문에 계산 시 오류가 나거나, double -> int로 형변환 시 소수점이 없어질 수 있다. 또 표현되는 범위가 다르기 때문에 오류가 날 수 있다. 

 

Q3. Java에서 String 객체를 생성하는 두 가지 방법(리터럴 방식과 new 키워드 사용)의 차이점을 설명하시오.

A3. 리터럴 방식을 사용하면 문자열이 상수 풀에 저장이 되고, new 키워드를 사용하면 항상 새로운 객체를 생성한다.

 

Q4. Java에서 문자열을 연결하는 방법 (String & StringBuilder)을 설명하고 어떤 방법이 성능 면에서 더 유리한 지 서술하시오.

A4. String에서 문자열을 연결하고 싶다면,

String result = "";
result += "wink";
result += " ";
result += "java study";
System.out.println(result);

이런 식으로 + 연산자를 사용하여 연결을 해야 한다. 이때 String에서 + 연산자를 사용하여 문자열을 연결할 때마다 새로운 객체가 하나씩 만들어진다. 반면 StringBuilder로 연결을 한다면

StringBuilder a = new StringBuilder();
a.append("wink");
a.append(" ");
a.append("java study");
String result = a.toString();
System.out.println(result);

이런 식으로 append를 사용하여 새로운 문자열을 추가하고 연결할 수 있다. 이때 StringBuilder는 객체를 하나만 생성하기 때문에 성능 면에서는 StringBuilder가 유리하다. 

 

Q5. Java에서 문자열 비교 시 == 연산자와 equals() 메서드의 차이점을 설명하시오.

A5. equals() 메서드는 문자열을 비교하여 같은 문자열인지 판단해주는 메서드이고, == 연산자는 2개의 자료형이 같은 객체인지를 판별해주는 연산자이다. 따라서 같은 값을 가지는 문자열 두 개가 있을 때, 한 문자열을 new 키워드를 이용해 새로운 객체를 생성한다면  equals() 메서드는 값이 같은 문자열이니 true를 반환하지만 == 연산자는 다른 객체이니 false를 반환한다.

 

Q6. 배열 선언 방법 2가지를 작성하시오.

A6. int [] evens = {2, 4, 6, 8}

int [] evens = new int[4]

 

Q7. 배열의 크기를 변경할 수 없다는 특성을 설명하고, 이 문제를 해결하기 위해 사용할 수 있는 대안에 대해 설명하시오.

A7. 배열은 크기를 설정할 때 고정되기 때문에 변경할 수 없다. 리스트에서는 크기를 변경할 수 있으므로 리스트를 사용하여 해결 가능하다.

 

코딩테스트 문제

1. https://school.programmers.co.kr/learn/courses/30/lessons/120807

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. https://school.programmers.co.kr/learn/courses/30/lessons/12916

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형