본문 바로가기

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

[2024-2 Java 스터디] 이가인 #1주차

반응형
  • 자바란
  • 자바 코드의 구조
  • 변수
  • 자료형
  • 배열
  • 리스트
  • 메서드 정리

 

 

자바

  • 객체 지향 언어
  • 웹, 모바일 앱 개발에서 가장 많이 사용됨
  • 우리나라 기업에서 많이 사용되어 자바를 기반으로 한 수많은 라이브러리들이 존재 --> 자바 강력 추천


자바 코드의 구조 

public class Sample {  // 클래스명 Sample
    public static void main(String[] args) { /* static이 붙으면 클래스 메서드가 되어 
    객체를 만들지 않아도 'Sample.main'으로 호출가능*/
    // 메서드명 main
        System.out.println("Hello java");
   // 메서드 안에는 명령문이 있으며 명령문은 반드시 세미콜론을 붙여 문장이 끝났다는걸 표시해야함 
   }
}

 

  • 클래스명 : Sample (클래스명은 명사이며 대문자로 시작한다 -> 파스칼 케이스)
  • 메서드명 : main (동사로 하며 소문자로 시작한다 -> 카멜케이스)

 




변수

  • 빈상자와 같음 (나중에 넣거나 뺄수도 있음)
  • 변수의 3가지 규칙

        1. 변수명은 숫자로 시작할 수 없다.

        2. _와 $ 이외의 특수 문자는 사용할 수 없다. 

        3. int, class, return 등 자바의 키워드는 변수명으로 사용할 수 없다.

 

 


자료형 

  • 자바의 기초가 되고 중요함
  • 변수의 자료형(type) 에 맞게 변수를 할당해야함
  • 자주 쓰이는 자료형
정수 ( int, long )  
int age = 10;
long countOfStar = 8764827384923849L;
 // long 자료형 변수에 값을 대입할 때 int 자료형의 최댓값인 2147483647보다 크면
 // 끝에 접미사로 L 자를 붙여 주어야 한다
 
 // L을 누락하면 컴파일 오류 발생!!
  • 증감 연산 ( ++, -- )
int i = 0;
System.out.println(i++);  // 0 출력 후 ++가 실행됨
System.out.println(i);  // 1 출력
int i = 0;
System.out.println(++i);  // 1 출력 (++이 먼저 된 거임!)
System.out.println(i);  // 1 출력

 

i++처럼 ++ 연산자가 변수명 뒤에 붙으면 해당 코드가 실행되는 순간에는 i값이 변경되지 않는다. 다만 i++ 문장이 실행된 이후에 i값이 증가한다. 이와 반대로 i++ 대신 ++i를 사용하면 i값이 먼저 증가된 후에 해당 코드가 실행된다.

 

 

 

실수 ( float, double )
float pi = 3.14F; //마찬가지로 f,F 안붙이면 컴파일 오류 발생!!
double morePi = 3.14159265358979323846;

 

 

 

불 ( boolean )
  • 참(true) 또는 거짓(false)의 값을 갖는 자료형
// 불 연산 사용 예1
boolean a = true;
boolean b = false;

// 불 연산 사용2 ( 조건문 )
int base = 180;
int height = 185;
boolean isTall = height > base;

if (isTall) {
    System.out.println("키가 큽니다."); // 출력 : 키가 큽니다
}  

// 불 연산 사용3 ( 조건문 )
int i = 3;
boolean isOdd = i % 2 == 1;
System.out.println(isOdd);  // true 출력

 

문자 ( 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 출력

     char은 많이 사용하는 편이 아니지만 위와 같이 문잣값을 표현하는 방식이 다양하다는 걸 유념하자.

 

 

 

문자열 ( String )

 

  • 리터럴 표기 방식
    • 가급적이면 이걸 사용하는게 좋다.
    • 가독성이 좋고 컴파일에 최적화
  • new 키워드 사용 표기 방식 ➡️ 객체 만들 때 사용
// 리터럴 표기
String a = "LG TWINS";
// new 객체
String a = new String("LG TWINS");

 

  • 문자열 내장 메서드 ( a. [메서드](b)  )
String a = "Hello Java";
String b = new String("Hello Java");

// 1. eqauls ( 문자열 2개 비교 )
System.out.println(a.equals(b));  // true
System.out.println(a == b);  // false

// 2. indexOf ( 시작 위치 리턴 )
System.out.println(a.indexOf("Java"));  // 6 출력

// 3. charAt ( 특정 위치 문자 리턴 )
System.out.println(a.charAt(6));  // J 출력

// 4. contains ( 특정 문자열 포함 여부 리턴 )
System.out.println(a.contains("Java"));  // true 출력

// 5. replaceAll ( 특정 문자열 바꿀 때 )
System.out.println(a.replaceAll("Java", "World"));  // Hello World 출력

// 6. substring ( 특정 문자열 뽑아낼 때 )
System.out.println(a.substring(0, 4));  // Hell 출력

// 7. toUpperCase ( 모두 대문자로 변경 )
System.out.println(a.toUpperCase());  // HELLO JAVA 출력

// 8.split ( 문자열 배열로 리턴)
String a = "a:b:c:d";
String[] result = a.split(":");  // result는 {"a", "b", "c", "d"}


    == 연산자는 2개의 자료형의 같은 객체인지를 판별할 때 사용 

 

 

 

문자열 포매팅
String. format 메서드 사용   

 

System.out.println(String.format("I eat %d apples.", 3));  // "I eat 3 apples." 출력
System.out.println(String.format("I eat %s apples.", "five"));  // "I eat five apples." 출력

int a = 4;
String b = "LG";
System.out.println(String.format("%S twins ready for V%d", b, a)); //"LG twins ready for V4"출력

( %s 포맷 코드는 어떤 형태의 값이든 변환해서 넣을 수 있다)

 

String.format과 printf 의 차이

  • String.format(): 포맷된 문자열을 반환하고, 이를 다른 변수에 저장하거나 후속 작업에 사용할 수 있음음
  • System.out.printf(): 포맷된 문자열을 바로 콘솔에 출력 -> 단순히 콘솔에 출력한다면 이거

 

 

 

StringBuffer (문자열 추가, 변경 시 주로 사용)

 

  • String과 차이점
    • String은 값을 변경할 수 없다 (immutable)                                                                                                             toUpperCase의 메서드를 쓸 수는 있지만 또 다른 객체를 생성하여 리턴하는 것 뿐이다.
    • StringBuffer()로 객체를 생성하면 String을 사용할 때보다 메모리 사용량도 많고 속도도 느리다
    • => 문자열을 추가하거나 변경하는 작업이 많으면 StringBuffer를, 적으면 String을 사용하는 것이 유리
  • 메서드
    1. append ( 추가 )
    2. toString ( StringBuffer를 String 자료형으로 변경 )
    3. insert ( 특정 문자열 삽입)
    4. substring ( 뽑아냄 )
StringBuffer a = new StringBuffer();  // StringBuffer 객체 a 생성
a.append("hello");
a.append(" ");
a.append("java");
String b = a.toString();
System.out.println(b);  // "hello java" 출력

a.insert(0, "happy ");
System.out.println(a); // "happy hello java" 출력

System.out.println(a.substring(0, 4)); // "happ" 출력

 

 


배열 

  • 자료형의 종류 X , 자료형의 집합 O
  • immutable 
//배열 만들기
int[] x = {1,3,5,7,9};

String[] a = {"무", "적", "엘", "지"}

 

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

 

초깃값 없이 배열 변수를 만들 때는 7과 같은 숫잣값을 넣어 길이 정해 줘야함

 - 그렇지 않으면 오류 발생!!

// 배열에 접근
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[3]);  // 목 

for (int i = 0; i < weeks.length; i++) { // weeks.lenth는 7이다
    System.out.print(weeks[i]);
} // 월화수목금토일

 length : 길이 구하는 메서드

System.out.println(weeks[7]);  
// 여덟 번째 배열값이 없으므로 ArrayIndexOutOfBoundsException 오류 발생

 

 

 


리스트 

  • 리스트는 크기가 정해져있지않아(mutable) 배열과 다르게 원하는 만큼 담을 수 있음
  • 마찬가지로 자료형의 종류가 아닌 자료형의 집합임
  • ArrayList, Vector, LinkedList
ArrayList

 

헷갈리지 말 것.

- 인덱스는 [0], [2] 와 같이 몇번째인지 나타내는것

- 객체(값, 요소)와 인덱스는 다름

 

  1. add (요소 추가)
  2. get ( 특정 인덱스 값 추출 )
  3. size (요소의 개수 리턴 )
  4. contains ( 해당 값 여부 판별, boolean으로 리턴)
  5. remove (객체) -> 객체에 해당하는 항목을 삭제한 뒤, 그 결과로 true 또는 false를 리턴
  6. remove (인덱스)  -> 해당 값을 삭제한 뒤, 그 항목을 리턴
import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList a = new ArrayList();
        a.add("138");
        a.add("129");
        a.add("142");
        
        System.out.println(a.get(1)); // 129 출력
        System.out.println(a.size()); // 3 출력
        System.out.println(a.contains("142")); // true 출력
        System.out.println(a.remove("129"));  // 129를 리스트에서 삭제하고, true를 리턴한다.
        System.out.println(a.remove(0));  // 첫 번째 항목 138을 삭제한 뒤, 138을 리턴한다.
    }
}

 

 

 

ArrayList<String> [변수] = new ArrayList<>();  

 

제네릭스 도입 전후의 차이는 ArrayList 자료형 다음에 <String>이 있는가에 있다.

제네릭스를 표현한 <String> ‘ArrayList에 담을 수 있는 자료형은 String뿐이다’라는 뜻이다.

즉, 제네릭스를 이용하면 자료형을 좀 더 명확하게 체크할 수 있다는 장점이 있다.!

 

제네릭스를 사용하지 않으면 ArrayList에 추가하는 객체는 Object 자료형( = 모든 객체가 상속하고 있는 가장 기본적인 자료형) 으로 인식된다.

따라서 ArrayList 객체인 [변수]에 값을 넣을 때는 문제가 없지만 값을 가져올 때는 매번 Object 자료형에서 String 자료형으로 형 변환(casting) 을 해야 한다. 이처럼 제네릭스를 이용하면 형 변환과 관련된 불필요한 코딩을 줄일 수 있고, 잘못된 형 변환 때문에 발생하는 런타임 오류를 방지할 수 있다

 

 

asList 와 add의 차이점 

 

 

  • asList()는 고정된 크기의 리스트를 반환하며, 구조를 변경할 수 없음
  • add()는 가변 리스트에 요소를 추가할 수 있으며, 크기를 동적으로 조절할 수 있음
  • asList는 나중에 더 자세하게 배우며 지금으로서는 add를 쓰도록 하자!

 

 

리스트 1개의 문자열로 만들기와 정렬하기

 

  • String.join (1개의 문자열로 만들기)
  • Comparator.naturalOrder(), Comparator.reverseOrder() ( 오름차순, 내림차순 정렬 sort메서드)
// String.join("구분자", 리스트 객체);

// 리스트 객체.sort(Comparator.naturalOrder());

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

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        String result = String.join(",", pitches);
        System.out.println(result);  // 138,129,142 출력
        
        pitches.sort(Comparator.naturalOrder());  // 오름차순으로 정렬
        System.out.println(pitches);  // [129, 138, 142] 출력
    }
}

 


메서드 정리

String length contains equals substring charAt replaceAll indexOf split
StringBuffer insert toString append substring        
배열  length              
리스트 size contains add get remove      
  • add() vs set()
    • add() : 리스트에 새로운 요소 추가
    • set() : 리스트에 기존 요소 수정 
  • get() vs put()
    • get() : Map에서 키에 해당하는 가져올 때
    • put() : Map에서 키와 값을 추가하거나 수정할 때
List<String> list = new ArrayList<>();
list.add("apple"); // 맨 끝에 추가
list.add(0, "banana"); // 첫 번째 위치에 삽입
list.set(1, "cherry"); // 두 번째 요소를 "cherry"로 변경
list.set(1, "cherry"); // 두 번째 요소를 "cherry"로 변경

Map<String, String> map = new HashMap<>();
map.put("name", "John"); // 새로운 키 - 값 추가
System.out.println(map.get("name")); // "John"

 

 

 


Quiz

  문제
1 다음 중 int 자료형의 크기는? c) 32비트(4바이트)
2 Java에서 소수점이 있는 실수형 데이터를 저장하기 위해 사용하는 자료형은? c) float
3 double 자료형과 float 자료형의 차이점은 무엇인가? b) double은 64비트, float은 32비트이다.
4 다음 중 boolean 자료형이 가질 수 있는 값은? a) truefalse
5 다음 중 boolean 값을 반환하는 메서드는?

a) isEmpty()
b) size()
c) toString()
d) charAt()
a) isEmpty() -> string이나 list에서 쓰임

size는 list에서 요소 개수 리턴
toString은 StringBuffer에서 객체로 반환하는 메서드
charAt는 String에서 특정 위치 문자 리턴
6 다음 중 boolean 표현식을 적절히 사용하는 경우는?

a) boolean x = 10;
b) boolean y = true;
c) boolean z = "true";
d) boolean w = 0;
b) boolean y = true;
7 다음 중 문자열을 상수 풀(String Pool)에 저장하는 방법은? b) "example"
8 다음 중 문자열 길이를 반환하는 메서드는?

a) length()
b) size()
c) getLength()
d) count()


a) length()
배열, 문자열이 length고 리스트는 size
c)는 자바에서 없는 단어
9 다음 코드의 출력 결과는 무엇인가?
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2);
c) 컴파일오류
s1.equals(s2)하면 true라고 나옴(객체의 내용비교)
==은 객체가 같은 메모리 위기를 가르키는지 확인하기때문에 오류
10 Java에서 배열의 길이를 얻기 위해 사용하는 속성은? b) length()
11 다음 중 Java에서 다차원 배열을 선언하는 올바른 문법은? b) int[][] arr = new int[2][2];
12 배열에 초기값 없이 선언된 int 배열의 기본값은? d) 컴파일 오류
배열은 꼭 길이의 초기값을 설정해주어야한다.
13 배열의 인덱스는 몇부터 시작하는가? a) 0
14 다음 코드의 출력 결과는?
int[] arr = {1, 2, 3, 4};
System.out.println(arr[2]);
a) 1
15 Java에서 List 인터페이스를 구현한 클래스가 아닌 것은? c) HashSet
16 다음 중 ArrayList의 기본적인 특징은 무엇인가? c) 임의 접근이 가능하다.
17 List에서 요소를 추가할 때 사용하는 메서드는? c) add()
18 다음 코드의 출력 결과는 무엇인가? b) Python
19 List의 요소를 반복하기 위해 사용할 수 있는 방법인 것은? d) 모두 맞음
20 Java에서 기본 자료형(primitive types)과 참조 자료형(reference types)의 차이점에 대해 설명하시오. 기본 자료형은 int, float, boolean과 같은 기본 연산을 하고 직접 저장하는 자료형이고 참조 자료형은 String, Array등 객체를 참조하며 메모리를 저장한다.
21 숫자형 자료형 간의 형 변환(예: int에서 double로 변환)이 발생할 때의 주의사항을 설명하시오.  int는 정수지만 double은 부동소수점 숫자이므로 정밀도손실과 자료 범위 초과에 유의하여야 한다.
22 Java에서 String 객체를 생성하는 두 가지 방법(리터럴 방식과 new 키워드 사용)의 차이점을 설명하시오. 리터럴 방식은 상수 풀에 저장되고 new 키워드를 사용하면 새로운 객체를 생성한다. 
23 Java에서 문자열을 연결하는 방법 (String & StringBuilder)을 설명하고 어떤 방법이 성능 면에서 더 유리한 지 서술하시오.  String은 문자열을 연결할 때 마다 새로운 객체를 생성하고 StringBuilder은 문자열을 가변적인 객체로 다루며 새로운 객체를 생성하지 않는다. 성능 면에서는 StringBuilder이 더 유리하다 
24 Java에서 문자열 비교 시 == 연산자와 equals() 메서드의 차이점을 설명하시오. ==연산자는 우선 같은 객체인지 비교하고 equals메서드는 객체비교를 하지않고 문자열 자체가 같은지 비교한다.
25 배열 선언 방법 2가지를 작성하시오. String[] a = {"무", "적", "엘", "지"}
String[] weeks = new String[7];
26 배열의 크기를 변경할 수 없다는 특성을 설명하고, 이 문제를 해결하기 위해 사용할 수 있는 대안에 대해 설명하시오. 배열을 생성할 때부터 크기를 지정하기때문에 고정된 크기가 있어 변경되지 않는다. 따라서 ArrayList를 사용하면된다. 

 

코테

끗..

반응형