본문 바로가기

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

[2024-2 Java 스터디] #1주차 김태일 "나야.. 자바.."

반응형

01. 자바란 무엇인가?

01-1 자바란?

- 객체 지향 프로그래밍 언어

- 웹과 모바일 앱 개발에서 가장 많이 사용하는 언어

 

01-2 자바로 무엇을 할 수 있을까?

- 웹 프로그래밍

- 안드로이드 애플리케이션 개발

- 게임 개발

- 데이터베이스 처리

- 빅 데이터 및 분산 처리

 실행 속도가 다소 느리므로 고성능이 중요한 분야에서는 불리

 

02. 자바 시작하기

02-1 자바 코드의 구조 살펴보기

- 클래스 블록 안에 여러개의 메서드 블록 존재

- 메서드 블록 안에 컴퓨터에 일을 시키는 명령문 존재

 클래스명과 소스파일의 이름이 똑같아야함

 

02-2 변수와 자료형

- 자료형을 변수명 앞에 표시

- class를 통해 자료형을 직접 만드는 것도 가능

 

02-3 이름 짓는 규칙

- 클래스명은 대문자로 시작

- 메서드명은 소문자로 시작

- 변수명은 의미를 알 수 있도록 짓는 것이 좋음

 

02-4 주석

1. 블록 주석 (/* */)

/*
여러줄 주석
*/

2. 라인 주석 (//)

//한줄 주석

 

03. 자바의 기초 - 자료형

- 자료형 : 데이터의 종류와 크기를 결정하는 기본 구성 요소

03-1 숫자

1. 정수

자료형 표현범위
byte (1바이트) -128 ~ 127
short (2바이트) -32768 ~ 32767
int (4바이트) -2147483648 ~ 2147483647
long (8바이트) -9223372036854775808 ~ 9223372036854775807

※ byte와 short는 표현범위가 너무 좁아 잘 사용하지 않음

 

- 만약 long자료형 변수에 값을 대입할때 int 자료형의 최댓값인 2147483647보다 크다면 끝에 L자를 붙여주어야 함

int age = 23;
long countOfStar = 8764827384923849L;

 

2. 실수

자료형 표현범위
float (4바이트) -3.4 * 10**38 ~ 3.4 * 10**38
double (8바이트) −1.7 ∗ 10**308 ~ 1.7 ∗ 10**308

 

- 실수형의 기본값은 double --> float변수에 값을 대입할 때에는 끝에 F자를 붙여주어야 함 (소문자도 가능)

float pi = 3.14F;      // F 누락 시 컴파일 오류 발생
double morePi = 3.141592;

 

- e2는 10의 제곱을 의미

double d1 = 1.234e2;  //123.4

 

 

3. 8진수와 16진수

- 8진수와 16진수는 int 자료형 사용

 

- 8진수 : 숫자 0으로 시작

int octal = 023;    // 십진수: 19

 

- 16진수 : 알파벳 x로 시작

int hex = 0xC3;     // 십진수: 195

 

4. 숫자 연산 & 증감 연산

- 숫자 연산 : 사칙연산을 수행하는 연산

- 증감 연산자 : 값을 증가 또는 감소시키는 연산자

 

 이 책의 3장에서는 두가지 연산자가 나오지만 자바 연산자의 종류가 많으므로 아래 티스토리를 통해 연산자를 확인!!

 

[Java] 자바 연산자

연산자(operator)- 연산에 사용되는 표시나 기호- 피연산자 : 연산이 되는 데이터종류연산자우선순위증감 연산자++, --1순위산술 연산자+, -, *, /, %2순위시프트 연산자>>, >>3순위비교 연산자>, =, 4순위

taei1.tistory.com

 

 

03-2 불(boolean)

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

boolean isTrue = true;
boolean isFalse = false;

 

03-3 문자

- 문자 자료형은 char를 이용

- 문자보다 문자열을 작성하는 경우가 많으므로 활용성이 적음

- 문잣값 앞뒤를 큰따옴표(" ")가 아닌 작은따옴표(' ')로 감싸주어야 함

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

※ 다음과 같이 문잣값을 표현하는 방식이 다양하므로 사용할 때 주의 필요 (세가지 모두 'a'라는 문자를 표현)

 

03-4 문자열

- 문자열을 나타내는 자료형은 String

- 파이썬과는 다르게 큰따옴표로만 감싸주어야 함 (큰따옴표, 작은따옴표 구분됨)

- 문자열을 아래와 같이 new 키워드를 사용하여 표현하는 것도 가능

String a = "Happy Java";
String b = "a";
String c = "123";
String a = new String("Happy Java");
String b = new String("a");
String c = new String("123");

 

 두 표현 방식의 차이점은 아래 티스토리를 통해 확인!! (https://taei1.tistory.com/33)

 

[Java] String = " " VS new String(" ")

Java 문자열 입력 방식? 큰따옴표(" ")안에 값을 입력하여 생성할 수도 있고, new 키워드로 새로운 객체를 생성할 수도 있다 먼저 두 방식을 소개하자면 이렇다. 1. 리터럴(literal) 표기방식- 리터럴

taei1.tistory.com

 

 

1. 문자열 내장 메서드

문자열 내장 메서드 설명 예제 코드 출력코드
equals 문자열 2개가 같은지를 비교하여 결괏값 리턴 String a = "hello";
String b = "java";
String c = "hello";
a.equals(b);
a.equals(c); 
false
true
indexOf 특정 문자여링 시작되는 위치 리턴 String a = "My name is WINK";
a.indexOf("is");
8       // is가 8번째 인덱스에 위치하기 때문
contains 문자열에서 특정 문자열이 포함되어 있는지 여부 리턴 String a = "Hello Java";
a.contains("Java"); 
true    // 문자열안에 Java 포함되어 있다면 true 리턴
charAt 특정 위치의 문자를 리턴 String a = "Spanish";
a.charAt(6); 
h       // 6번째 인덱스인 h 반환
replaceAll 특정 문자열을 다른 문자열로 바꿀 때 사용 String a = "My name is Tim";
a.replaceAll("Tim", "Mickey"); 
"My name is Mickey"
// Tim이 Mickey로 변환 
substring 문자열에서 특정 문자열을 뽑아낼 때 사용 String a = "Hello Mickey";
a.substring(0, 4);  
Hell       // 0~3번째 문자열 출력, 인덱스 4의 문자는 포함하지 않음
 toUpperCase 문자열을 모두 대문자로 변경할 때 사용 String a = "Hello Mickey";
a.toUpperCase();  
// HELLO MICKEY
split 문자열을 특정한 구분자로 나누어 문자열 배열로 리턴 String a = "a:b:c:d";
String[] result = a.split(":");  
{"a", "b", "c", "d"}

 

2. 문자열 포매팅

- 문자열 안에 특정한 값을 바꾸도록 해주는 기법

- String.format 메서드 사용

String.format("I eat %d apples.", 3);       // "I eat 3 apples."     %d를 이용해 숫자 대입
String.format("I eat %s apples.", "five");  // "I eat five apples."  %s를 이용해 문자열 대입
코드 설명
%s 문자열 (String)
%c 문자 1개 (Character)
%d 정수 (Integer)
%f 부동소수 (Floating-point)
%o 8진수
%x 16진수
%% 문자 % 자체

 %s 는 자동으로 전달되는 파라미터 값을 문자열로 바꾸어 사용  --> 어떤 값이 와도 상관 X

 

03-5 StringBuffer

- 문자열을 추가하거나 변경할 때 사용하는 자료형

- 문자열을 추가하거나 변경하는 작업이 많으면 StringBuffer 를 사용하는 것을 추천!

메서드 설명 예제 코드 결과 코드
append 문자열을 추가하는 메서드 StringBuffer sb = new StringBuffer();  
sb.append("Hi "); 
sb.append("Mickey");                   
String result = sb.toString();         
//StringBuffer 객체 생성
// "Hi " 추가
// "Mickey" 추가
// result = "Hi Mickey"
insert 특정 위치에 원하는 문자열을 삽입 StringBuffer sb = new StringBuffer();  
sb.append("Mickey");                  
sb.insert(0, "Hi");    
String result = sb.toString(); 
//StringBuffer 객체 생성
// "Mickey" 추가
// 0번째 위치에 "Hi" 삽입
// result = "Hi Mickey"
substring 원하는 위치의 문자를 뽑아낼때 사용 StringBuffer sb = new StringBuffer();  
sb.append("Mickey"); 
sb.insert(0, "Hi");
sb.substring(0,4);     
//StringBuffer 객체 생성
// "Mickey" 추가
// 0번째 위치에 "Hi" 삽입
// 0~3번째 문자 반환 "Hi M"

 빈 문자열에 append 를 사용하는 대신 += 을 사용해 추가를 한다면 4개의 객체를 만들어야 함 --> 비효율적임

 

03-6 배열 (array)

- 자료형 바로 옆에 [] 기호를 붙여 표현

- 자료형의 집합 (자료형의 종류가 X)

int[] odds = {1, 3, 5, 7, 9};
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};

 

1. 배열의 길이 설정하기

- new String [] 를 통해 길이 설정

String[] winks = new String[7];     // 배열의 길이를 7로 설정
String[] connect = new String[];    // 숫자를 넣어주지 않으면 컴파일오류 발생

 

2. 배열값에 접근하기

- []를 통해 배열값에 접근

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
weeks[3];          //3번째 인덱스인 "목"에 접근

 

3. 배열의 길이 구하기

- length를 사용하여 길이 확인

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
for (int i = 0; i < weeks.length; i++) {      //weeks.length = 7
    System.out.println(weeks[i]);
}

 

 

03-7 리스트

- 리스트는 배열과 달리 크기가 정해져 있지 않음

- 리스트 자료형로는 ArrayList를 일반적으로 사용

 

1. 메서드

메서드 설명 예제 코드 츨력 코드
add 요솟값을 추가하는 메서드 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add(
"142");
 {"138", "129", "142"}
get 특정 인덱스 값을 추출 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add(
"142");
System.out.println(pitches.get(1));
 129
size 요소의 개수를 리턴 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add("142"
);
System.out.println(pitches.size());
3
contains 리스트 안에 해당 항목이 있는지 판별해 그 결과를 boolean으로 리턴 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add("142"
);
System.out.println(pitches.contains("142"));
true
remove(객체) 리스트에서 객체에 해당하는 항목을 삭제한 뒤, 그 결과로 true 또는 false를 리턴 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add("142"
);
System.out.println(pitches.remove("129"));
true
revmove(인데스) 인덱스에 해당하는 항목을 삭제한 뒤, 그 항목을 리턴 ArrayList pitches = new ArrayList();
pitches.add(
"138");
pitches.add(
"129");
pitches.add("142"
);
System.out.println(pitches.remove(0));
138

 

2. 제네릭스

- 리스트를 만들때 자료형을 선언함  --> 형 변환하는 과정 생략 가능

ArrayList<String> pitches = new ArrayList<>();  //제네릭스 선언법

 

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

- java.util.Arrays 클래스의 asList 메서드를 사용

String[] data = {"138", "129", "142"};  // 이미 투구수 데이터 배열이 있다.
ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data));
System.out.println(pitches);  // [138, 129, 142] 출력

 

4. String.join

- 각 요소에 구분자를 넣어주어야 하는 경우 사용

ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        String result = String.join(",", pitches);
        System.out.println(result);  // 138,129,142 출력
    }
}

 

5. 리스트 정렬하기

- java.util.Comparator 클래스의 sort 메서드를 사용하여 순서대로 정렬

rrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        pitches.sort(Comparator.naturalOrder());  // 오름차순으로 정렬
        System.out.println(pitches);  // [129, 138, 142] 출력
    }
}
  • 오름차순(순방향) 정렬 - Comparator.naturalOrder()
  • 내림차순(역방향) 정렬 - Comparator.reverseOrder()

 

 

Quiz

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

답 : c) 32비트

 

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

답 : c) float

 

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

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

 

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

답 : a) true와 false

 

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

답 : a) isEmpty()

 

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

답 : b) boolean y = true;

 

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

답 : b) "example"

 

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

답 : a) length()

 

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

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

답 : b) false

 

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

답 : c) length

 

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

답 : b) int[][] arr = new int[2][2];

 

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

답 : a) 0  (int의 디폴트 값은 0이므로)

 

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

답 : a) 0

 

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

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

답 : c) 3

 

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

답 : c) HashSet 

 

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

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

 

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

답 : c) add()

 

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

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

답 : b) Python

 

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

답 : d) 모두 맞음

 

서술형 문제

 

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

답 : 기본자료형은 실제 값을 변수에 저장하고, 참조자료형은 데이터가 저장된 위치가 저장된다.

(String의 경우 리터럴 방식으로 저장할 경우 값 자체를 저장하는 것처럼 보이지만 실제로는 상수 풀에 저장하고 그 주소가 저장되어 참조자료형으로 구분됨)

 

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

답 : 형 변환이 자동으로 이루어지므로 소수점 이하 부분이 0으로 채워진다. 산술 연산 시 정수연산을 하고 double에 저장을 하게 될 경우 연산값은 정수연산을 한 값이 나온 후 형 변환이 되므로 이 점을 유의하여야 한다.

반대(double에서 int로 변환)의 경우 소수점 이하가 잘려 값이 변경되므로 주의하여야 한다.

 

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

답 : 리터럴 방식으로 저장할 경우 String Pool에 저장이 되지만 new키워드를 사용하면 새로운 객체를 생성하게 된다.

 

[Java] String = " " VS new String(" ")

Java 문자열 입력 방식? 큰따옴표(" ")안에 값을 입력하여 생성할 수도 있고, new 키워드로 새로운 객체를 생성할 수도 있다 먼저 두 방식을 소개하자면 이렇다. 1. 리터럴(literal) 표기방식- 리터럴

taei1.tistory.com

 

 

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

답 :  String은 += 을 통해 문자열을 연결하고, StringBuilder는 append메서드를 통해 연결한다.

첫번째 방법("+=")은 문자열을 추가 할 때마다 객체를 만드므로 성능면에서 비효율적이다.

 

 

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

답 : == 연산자는 객체의 주소값을 비교하고, equals() 메서드는 문자열의 실제 값을 비교한다. 쉽게 말해 ==연산자는 위에서 계속 말했듯이 문자열 상수 풀에서 같은 리터럴을 사용하였는지를 따지는 것이고, equals()메서드는 문자열의 생긴 모양이 같은지를 따지는 것이다.

 

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

답 : int[] numbers;                  -->    int 타입의 배열 선언

int[] numbers = new int[3]      -->   배열 선언 후 크기 지정

 

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

 답 : 배열의 크기는 고정되어 있으므로 변경이 불가능하다. 동적배열인 ArrayList활용하면 add 메서드를 통해 추가, remove메서드를 통해 삭제가 가능하다.


코딩테스트 문제

숫자 비교하기 (난이도: 하)

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

 

 

문자열 내 p와 y의 개수 (난이도: 중하)

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

 


꿀팁

배열 정렬 방법

  1. Array 타입
int[] arr = {4,2,5,1,3}
Arrays.sort(arr);
  1. List container 타입
import java.util.*;

ArrayList<Integer> arr = new ArrayList<>();
arr.add(3);
arr.add(5);
arr.add(1);

Collections.sort(arr);

 

반응형