본문 바로가기

diary/codestates (be39)

05/04/22 [1/2] [Java] 자바 자바 자바 기초 떼기

Java

1. 운영체제에 독립적이다

  • JRE(Java Runtime Environment: JVA; Java Virtual Machine + 표준 클래스 라이브러리)가 설치되어 있는 모든 운영체제에서 실행 가능하다
  • 이전의 언어: 특정 cpu에서만 작동하거나 os에 따라 다르게 작성

2. 객체 지향 언어

  • 모든 기능은 객체로 만들어 사용한다
  • 객체는 프로그램이 동작하는 부품
  • 유지보수 용이 확장성 높음

3. 함수형 프로그래밍 지원

  • 람다식, 스트림: 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 쉽고 코드가 간결해짐

4. 자동 메모리 관리

  • garbage collector를 실행시켜 자동으로 사용하지 않는 메모리를 수거한다
  • 메모리 관리하는 수고 줄이고 핵심 코드에 집중

JVM; Java Virtual Machine

자바는 컴파일러를 통해 기계어로 변환되는 언어

컴파일: 특정 프로그래밍 언어를 기계가 이해할 수 있는 언어로 옮기는 번역 과정

  • 자바 언어 → JVM이 이해할 수 있는 코드(바이트코드)로 변환하는 것
  • JVM은 바이트코드를 운영체제에 맞는 기계어로 변환해준다

자바 프로그램을 실행시키는 도구

  • 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램
  • 프로그램을 실행하는 프로그램

프로그램은 실행되려면 컴퓨터의 자원을 활용해야 한다. 자원은 운영체제가 관리하므로 프로그램은 운영체제의 규칙을 따라야 한다. 서로 다른 운영체제에서는 서로 다른 절차.

jdk/jre 와 함께 자동 설치

 

JDK

JRE: JVM + 표준 클래스 라이브러리 > 실행

JDK(Java Development Kit): JRE + 개발에 필요한 도구

개발하려면 jdk


데이터 타입

컴퓨터가 데이터를 다룰 때 데이터는 메모리에 임시로 기억된다

이때 컴퓨터는 데이터가 어떤 종류, 얼만큼의 크기인지를 알아야 한다.

→ 데이터를 보관할 메모리 공간 확보

데이터 타입은 데이터의 종류와 크기를 결정 짓는 것!

정수 타입 - byte, short, int, long

byte: 1byte

short: 2byte

int: 4byte

long: 8byte LLLLLLLLLLLLLL

실수 타입 - float, double

float: 4byte fffffffffffffff

double: 8byte

논리 타입 - boolean

t/f

문자 타입 - char

단 하나의 문자만 저장한다

자바는 유니코드에 기반해 문자를 표현한다 - 2byte

문자를 변수에 대입하면 문자에 해당하는 정수(유니코드값)이 저장되는 것~


클래스 타입 String

자바는 문자열을 String 변수에 저장한다ㅏㅏㅏㅏㅏㅏㅏㅏ

String 변수;
변수 = "문자열";

String 변수 = "문자열";

String 변수 = new String("문자열");

 

문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다

기본적으로 문자열 리터럴이 같으면 같은 객체 참조함 

String str1 = "sleepy";
String str2 = "sleepy";
String str3 = new String("sleepy"); //new 연산자로 객체 새로 생성함

//서로 같은 객체를 참조하는지
System.out.println(str1==str2); //true
System.out.println(str1==str3); //false

//서로 문자열이 같은지
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true

대표적인 String 메서드

charAt()

문자열의 특정 인덱스에 해당하는 문자를 반환한다.

해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면 오류

String str = new String("Java");
System.out.println(str); //Java

System.out.println(str.charAt(0)); //J
System.out.println(str.charAt(1)); //a
System.out.println(str.charAt(2)); //v
System.out.println(str.charAt(3)); //a
//System.out.println(str.charAt(4)); Exception: String index out of range: 4

System.out.println(str); //Java

compareTo() / compareToIgnoreCase()

compareTo(): 대소문자 구분

compareToIgnoreCase(): 대소문자 구별 없이 반환

해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교한다

비교한 문자열과 같으면 0을 반환

전달된 문자열 이후 음수 이전 양수 반환 (아스키코드// a가 제일 작고 bcd~~ 커짐 a=97, A=65

String str = new String("abcd"); 

System.out.println(str); //abcd
System.out.println(str.compareTo("bcdf")); //-1
//a랑 b랑 다름 a-b = 97-98
System.out.println(str.compareTo("abcd")); //0
//문자열 다 똑같음 0
System.out.println(str.compareTo("abaa")); //2
//c부터 문자열 다름 c-a = 99-97
System.out.println(str.compareTo("Abcd")); //32
//a랑 A랑 다름 a-A = 97-65
System.out.println(str.compareToIgnoreCase("Abcd")); //0
//대소문자 무시하면 같음 0
System.out.println(str); //abcd

 

concat()

해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열 반환

기존 문자열 + concat()으로 호출된 문자열

String str = new String("Java");
System.out.println(str); //Java
System.out.println(str.concat("수업")); //Java수업
System.out.println(str); //Java수업

indexOf()

해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환

해당 문자열에 포함되어 있지 않다면 -1을 반환

String str = new String("Oracle Java");
System.out.println(str); //Oracle Java
System.out.println(str.indexOf('o')); //-1
System.out.println(str.indexOf('a')); //2
System.out.println(str.indexOf("Java")); //7
System.out.println(str); //Oracle Java

trim()

해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거

String str = new String(" Java  ");
System.out.println(str); // Java  
System.out.println(str + '|'); // Java  |
//공백 확인을 위해 | 같이 출력
System.out.println(str.trim() + '|'); //Java| 
System.out.println(str); // Java

toLowerCase() / toUpperCase()

해당 문자열의 모든 문자를 소문자/대문자로 변환

String str = new String("Java");
System.out.println(str); //Java
System.out.println(str.toLowerCase()); //java
System.out.println(str.toUpperCase()); //JAVA
System.out.println(str); //Java

StringTokenizer

문자열을 지정한 구분자로 쪼개준다

쪼개준 문자열은 token //3토큰

import java.util.StringTokenizer

int countTokens()

남아 있는 토큰의 개수를 반환한다

전체가 아니라 ㄴ남아있는거~~

boolean hasMoreElements() / boolean hasMoreTokens()

다음의 토큰을 반환한다 (둘다 똑같은 값 반환함)

StringTokenizer는 내부적으로 어떤 위치의 토큰을 사용했는지를 기억함

그리고 그 위치를 다음으로 옮긴다

다음에 읽을 토큰이 있으면 true 없으면 fasle~

Object nextElemet() / String nextToken()

다음의 토큰을 반환함

반환형만 다름~

package unit1_string;

import java.util.StringTokenizer;

public class StringTokenizerExample {
    public static void main(String[] args) {
        String str = "This is a stirng example using StringTokenizer";

        StringTokenizer tokenizer = new StringTokenizer(str);
        //str을 매개값으로 받는 StringTokenizer 객체 생성

        System.out.println(str); //This is a stirng example using StringTokenizer
        System.out.println();


        System.out.println("total tokens: " + tokenizer.countTokens());
        //total tokens: 7

        while(tokenizer.hasMoreTokens()){
            System.out.println(tokenizer.nextToken());
        }
        
        /*
        while : tokenizer.hasMoreTokens() 값이 false가 될때까지 루프
        토큰 7개에서 시작~~
        tokenizer.nextToken() : StringTokenizer 객체에서 다음 토큰을 읽는다
        sout :  첫 토큰인 This부터 시작해서 다음 토큰인 is, a, ...해서 StringTokenizer
        까지 읽고 나면 더 읽을 토큰이 남아 있지 않으므로 hasMoreToken() 값은 0(false)가
        돼서 while문은 빠져나온다는 흐름!
        */

        System.out.println("total tokens: " + tokenizer.countTokens());
    }
}

StringTokenizerExample 출력

근데 이거 워따 써요?

>>>> 3일만에 썼다. String으로 받은 문자열을 token으로 나눠 int로 연산할 때 썼다.

 

java/ 백준 15552 빠른 A+B

문제 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. Java를 사용하고 있다면, Scanner와 System

romcanrom.tistory.com

 


StringBuilder / StringBuffer

StringBuilder

한번 생성된 String 클래스의 인스턴스는 여러 개의 문자열을 더하기 위해서는 매번 새로운 인스턴스를 생성해야 한다. > 해결하기 위한 방법 StringBuilder

package unit1_string;

public class StringStringBuilder {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        //StringBuilder 객체 생성
        stringBuilder.append("문자열 ").append("연결");
        //append()에 연결할 문자열을 넣어서
        String str = stringBuilder.toString();
        //str에 toString()을 붙여서 값 대입
        System.out.println(stringBuilder); //문자열 연결
        System.out.println(str); //문자열 연결
    }
}

StringBuffer

String 클래스의 인스턴스는 한번 생성되면 값을 읽을 수만 있고 변경할 수 없다.

StringBuffer 클래스의 인스턴스는 값의 변경, 추가가 가능하다.

  • 내부적으로 buffer라고 하는 독립적인 공간을 가짐
  • buffer의 기본값은 16개의 문자를 저장할 수 있는 크기, 생성자를 통해 크기 별도 설정 가능

인스턴스는 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유가 있는 크기로 생성됨

 

(+) 연산자로 String의 문자열 결합 시 내용이 합쳐진 새로운 String 인스턴스를 생성한다.

→ 문자열을 많이 결합할수록 공간이 낭비되고 속도도 느려짐

→ StringBuffer 사용 >> 문자열을 바로 추가해서 공간의 낭비도 없고 속도도 빠르다.

1. append()

인수로 전달된 값을 문자열로 변환 후 해당 문자열의 마지막에 추가한다.

String 클래스의 concat() 메서드와 같은 결과를 반환하지만 내부 처리 속도가 훨씬 빠름.

StringBuffer str = new StringBuffer("Java");
System.out.println("orginal str: " + str);
System.out.println(str.append(" programming"));
System.out.println("str.append(): " +  str);

2. capacity()

StringBuffer 인스턴스의 현재 buffer 크기 반환

StringBuffer str1 = new StringBuffer();
StringBuffer str2 = new StringBuffer("Java");
System.out.println(str1.capacity()); //16
//StringBuffer의 기본 buffer 크기는 16
System.out.println(str2.capacity()); //20
//16+Java의 길이 4

3. delete()

전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다.

(시작인덱스, 끝인덱스) >> 시작 인덱스부터 끝 인덱스 전까지 제거

deleteChatAt(): 특정 위치의 문자 한 개만을 제거한다

StringBuffer str3 = new StringBuffer("Java Oracle");

System.out.println("original str3: " + str3); //Java Oracle

System.out.println(str3.delete(4, 8)); //Javacle
//4번째 인덱스( )부터 8번째 인덱스(c) 전까지의 문자열이 제거된다

System.out.println(str3.deleteCharAt(1)); //Jvacle
//1번째 인덱스(a)가 제거된다

System.out.println("deleted str3: " + str3); //Jvacle

4. insert()

인수로 전달된 값을 문자열으로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가

StringBuffer str4 = new StringBuffer("Java Programming!!");

System.out.println("original str4: " + str4); //Java Programming!!

System.out.println(str4.insert(4, "Script")); //JavaScript Programming!!
//4번째 인덱스 위치에 Script 문자열을 추가한다

System.out.println("inserted str4: " +str4 ); //JavaScript Programming!!

*String이랑 비교했을 때 마지막 출력 > 원본 문자열 바뀜


타입 변환

자동 타입 변환

바이트 크기가 작은 타입에서 큰 타입으로 / 덜 정밀한 타입에서 더 정밀한 타입으로 저장될 때 자동으로 일어남

byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)

수동 타입 변환

큰 타입에서 작은 타입으로는 자동 타입 변환이 일어나지 않는다 >> 수동으로 타입 변환 해줘야 됨

int intValue = 128;
System.out.println(intValue); //128

byte byteValue = (byte)intValue; //-128
//오버플로우 발생
System.out.println(byteValue);

콘솔 출력

System.out.print();

개행 없는 출력

System.out.println();

개행하는 출력

System.out.printf();

형식대로 출력

%b 불리언

%d 10진수

%o 8진수

%x, %X 16진수

%c 문자

%s 문자열

%n 줄바꿈

System.out.printf("%s%n", "hello java"); //hello java
System.out.printf("%s%n", "bye" + "java"); //byejava
System.out.printf("%d%n", 3+6); //9
System.out.printf("지금은 %s", 2022 + "year");
System.out.printf("나는 %c%s", '로', "로로로"); //지금은2022year나는 로로로로

콘솔 입력

import java.util.Scanner;
//Scanner 클래스 import

Scanner scanner = new scanner(System.in);
//Scanner 클래스의 인스턴스 생성
String inputValue = scanner.nextLine();
//inputValue에 입력받은 내용 저장

System.out.println(inputValue);
//입력받은 내용 출력

 

 

**쓰다가 너무 길어져서 pair는 새글로 작성

🐑 Daily 회고 (1/2) - Java 기초 개념

- 자바 1장만 123843984회독 하는 사람 됨

  • 이쯤 되면 얘네도 내가 지겹지 않을까?
  • 이번 부트캠프에서는 자바 기초만 말고 완전히 떼는 거 가능하겠죠?