코드스테이츠 - 자바(Java) 타입, 문자열

kwak woojong·2022년 5월 4일
0

코드스테이츠

목록 보기
9/36
post-thumbnail

코드스테이츠 2주차 수요일, 드디어 Java 기초에 입문

인터페이스랑 추상클래스, 다형성 들어가려면 좀 시간이 필요한듯

실은 개인 notion에 다 정리를 해놨었는데, Java 기초를 다시 다질겸...


1. 타입 (기본 타입, 참조 타입)

기본 타입은 데이터 값을 보여줌. 아래 나오는 정수뭐시기저시기는 다 이 기본타입이라고 봐도 된다.

참조 타입은 주소만 딸랑 보여준다. 이걸 눈으로 보려면 약간의 다른 방식으로 만들거나 해야함.

String[] arr = {"손흥민", "박지성", "황의조"};
System.out.println(arr); //뭐라뭐라 배열의 주소값만 출력;

String soccer = Arrays.toString(arr); // arr 배열을 String화
System.out.println(soccer); // [손흥민, 박지성, 황의조] 출력

1. 정수 타입 (byte, short, int, long)

정수 타입은 보통 int를 씀. 컴퓨터 하드웨어의 발달로 메모리가 무지막지하게 커진 만큼 byte나 short은 고려하지 않아도 된다.

아마 성능 향상 쥐꼬리라도 하려면, 신경을 써야겠지?

타입 메모리 범위 기타
byte 1byte -128(-27) ~ 127(27 - 1) wrapper 클래스로 Byte가 있다.
short 2byte -32,768(-215) ~ 32,767(215 - 1) int(4byte)보다 짧다는 의미로 short를 쓴다.
wrapper 클래스로 Short이 있다.
int 4byte -2,147,483,648(-231) ~ 2,147,483,647(231 - 1) 정수 Integer의 약자다.
wrapper class로 Integer가 있음.
long 8byte -9,223,372,036,854,775,808(-263) ~
9,223,372,036,854,775,807(263 - 1)
int보다 길다는 의미로 long을 쓴다.
변수 할당시 맨 끝에 L을 붙여준다.
wrapper로 Long이 있다.
1byte는 8bit다. 이진수가 8개 모은게 1byte란 뜻임. 그래서 상기 표의 모든 범위가 그에 따라 정해져 있다.
음양을 표현하는 1개의 bit를 제외하고 나머지 (int는 32bit임. 여기서 31bit만) 숫자로 표현된다.
마지막에 -1이 들어가 있는 이유는 0 때문이다.

2. 실수 타입 (float, double)

소수점을 표현하기 위한 타입이다. 요샌 메모리가 커져서 double를 많이 쓴다는 듯.

  • float : 4byte
  • double : 8byte

위에 사항만 알면 된다. int랑 float랑 얼추 비슷한 느낌이고 Long이랑 double가 얼추 비슷하다.
다만 실수를 사용할 때에 메모리도 넉넉하니까 그냥 double를 쓰자.
소수점이 1~2자리 필요하면 float로 맞춰도 되긴 함.


3. 논리 타입 (boolean)

true, false를 말한다.

boolean은 단 두가지 밖에 없다. 1bit만으로도 표현이 가능하나, JVM(자바 가상 머쉰)이 다루는 가장 낮은 최소 데이터 단위가 1byte라서 1byte 크기를 차지한다. 즉 8bit

먼지톨만큼도 안되는 경험상 논리 타입은 무언가 있는지, 없는지 체크할 때 많이 쓰는듯

boolean isAbsolute = true;

if(isAbsolute) {
	System.out.println("인생 독고다이여");
} else {
	System.out.println("실은 외롭다니까");
}

if는 괄호 (boolean)을 받는데 true면 중괄호 안쪽을 실행하고 false면 무시하고 넘어간다.

비교연산자 (==, !=, >, <, >=, <=)도 boolean을 뱉게 되어 있다.

int height = 180;

if(height >= 180) {
	System.out.println("공기는 어떠십니까?");
} else {
	System.out.println("앗 미안합니다. 방구 꼈습니다.");
}

4. 문자 타입 (char)

난 잘 안쓴다. char는 1글자를 저장한다.

char knew= '여';
char i = '윾';
char t = '시';
System.out.println(knew + i + t); // 여윾시 출력

2. String

String은 놀랍게도 참조 자료형이다. 클래스로 객체로 생성되고 관리됨. 그래서 그놈의 메서드가 드럽게 많다.

어? System.out.print() 썼을 때 주소값이 아니라 그냥 나오던데요?

String은 원래 그렇다. 원래는 주소값이 나오는게 맞는데, 자바 내부에서 바로 값이 보이게 설정되어 있다.

이거도 깊게 들어가면 꽤 복잡한거 같은데 printSteam 들어가보고 난리쳤는데 잘 못알아보겠음.

하여튼 주소값을 가지는 참조형이기 때문에

String a = "hi";
String b = new String("hi");
System.out.print(a == b); // false

가 된다. hi는 똑같지만 new String으로 새로운 객체를 만들었으므로, 주소값이 달라짐

1. charAt()

String str = "가나다라마바";
System.out.println(str.charAt(0)); // '가' 출력
System.out.println(str.charAt(1)); // '나' 출력
System.out.println(str.charAt(str.length()-1 )); // '바' 출력

charAt은 괄호에 인덱스 값을 넣으면 그 인덱스 값에 맞는 숫자가 출력된다. 시작 인덱스는 0임.
str 길이보다 크면 에러를 뱉는다.
length()는 문자열의 길이를 뱉는 메서드인데 여기선 6을 뱉는다. 근데 인덱스 시작은 0이니까 -1을 해주면 5가 돼서 '바'출력

2. compareTo()

사전 편찬순으로 문자열끼리 비교해준다. 아마 아스키코드를 이용해서 비교하는거 같은데

String str1 = "가나다라마바";
String str2 = "나다라마바사";
String str3 = "가나다라마바";
System.out.println(str1.compareTo(str2));  //음수 출력
System.out.println(str1.compareTo(str3));  // 0 출력
char a = 44032;
char b = 45208;

System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("a-b = " + (44032-45208));

str1과 str2에서 사전 편찬순이니까 "가" 다음에 "나"가 올거고 이 아스키코드 차이를 뱉는거 같다.

크으 개쩌럿쥬?

3. concat()

해당 문자열 뒤에 인수로 받은 문자열을 합쳐서 리턴한다. 이거 어디다 쓰는지 모르겠다.

        String str = "안녕";
        String str2 = " 세계";
        System.out.println(str.concat(str2)); //"안녕 세계" 출력

4. indexOf()

문자열에서 특장 문자나 문자열이 처음으로 시작하는 인덱스를 반환하는데, 없으면 -1을 뱉는다. 이거 알고리즘에서 가끔 쓰이니까 중요하다.

지정해둔 맨 처음 문자만 찾으니까 뒤에 중복 있어도 안뜸. 만약 뒤에서부터 세고 싶으면 lastIndexOf()를 써야 한다.

       String str = "가나다라마바사아자차카";
        String str2 = "다";
        String str3 = "바사";
        String str4 = "박똘똘 응급실 ㅋㅋㅋㅋ 후회~하고있어요";
        System.out.println(str.indexOf(str2)); // 2
        System.out.println(str.indexOf(str3)); // 5
        System.out.println(str.indexOf(str4)); // -1

5. trim()

맨 앞과 맨 뒤 모든 공백을 제거해준다.
설명할게 딱히 없는 메서드

6. toLowerCase(), toUpperCase()

Stirng.toLowerCase()는 String을 모두 소문자로 toUpperCase()는 대문자로 반환해준다.
조건에 따라 여기는 소문자 저긴 대문자로 바꾸는 알고리즘이 있을 수 있다.

어차피 조건 뽑아내는게 어려운거지 저 메서드 쓰는게 어려운건 아니니까... 하지만 알아두긴 해야한다.
저거 모르고 걍 하면 아스키코드로 변환하고 알파벳이니까 +- 32 하고 있지 말고 그냥 메서드 쓰자

7. String[] split()

이거 내가 자바스크립트 할 때 진짜 유용하게 썼던 메서드다.
split() 인자로 String이 들어가는데 이걸 기준으로 쫙쫙 쪼개서 배열로 만들어준다.

        String str = "우리의소원은통일";
        String[] arr = str.split("");
        for (String s : arr) {
            System.out.println(s);
        }


println이라 띠워서 나왔음 ㅋㅋㅋ 하여튼 위 코드에선 "" 빈거로 떼었기 때문에 1글자씩 쪼개졌음.

        String str = "우리의방소원은방통일";
        String[] arr = str.split("방");
        for (String s : arr) {
            System.out.println(s);
        }

이렇게 하면 어떨까?

방을 없애고 arr[0] = "우리의", arr[1] = "소원은", arr[2] = "통일" 이 됐다.

8. length()

String의 길이를 뱉어 준다. 배열 length랑 헷갈리면 안된다. 배열 length는 괄호가 안붙고 String은 붙는다.

        String str = "다섯글자임";
        System.out.println(str.length()); // String 길이 5

        String[] arr = str.split("");
        System.out.println(arr.length); // 배열 길이 5

9. 번외편 StringTokenizer, StringBuilder, StringBuffer

1. StringTokenizer

String을 단위별로 짤라준다. 문자열을 받아서 정규식으로 지정한 방식으로 짜르는듯 그리고 얼마나 짤렸는지도 알 수 있고

        String str = "This is a string example using StringTokenizer";
        StringTokenizer tokenizer = new StringTokenizer(str);
        // tokenizer에 짤려서 들어간다.
        System.out.println(str);
        System.out.println();
        
     	System.out.println("total tokens:"+tokenizer.countTokens()); //7

	while(tokenizer.hasMoreTokens()){
		System.out.println(tokenizer.nextToken());
	}
	System.out.println("total tokens:"+tokenizer.countTokens());

split처럼 배열화 시키는게 아니라 리스트화 시키는거 같음. 부를때 next로 부르는거 보니까 그래보이는데, 정확한건 공부를 좀 해야 할거 같다.

2. StringBuilder

예전에 씨샵으로 알고리즘 풀때 썼었다.

String에 계속 문자열을 담으면 String객체를 호출하고 넣고 반복해야함.

얘는 걍 넣어주다가 필요할 때 호출만 할 수 있다.

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("문자열 ").append("연결").append("캬캬");
        String str = stringBuilder.toString();
        System.out.println(stringBuilder);
        System.out.println(str);

지금이야 뭐 성능 체감이 안들긴 하지만, 좀 크게 키워보면 확 티난다.

    public static void main(String[] args) {
        long now = System.currentTimeMillis();
        slow();
        System.out.println("slow elapsed " + (System.currentTimeMillis() - now) + " ms");

        now = System.currentTimeMillis();
        fast();
        System.out.println("fast elapsed " + (System.currentTimeMillis() - now) + " ms");
    }

    private static void fast()
    {
        StringBuilder s = new StringBuilder();
        for(int i=0;i<100000;i++)
            s.append("*");
    }

    private static void slow()
    {
        String s = "";
        for(int i=0;i<100000;i++)
            s+="*";
    }


slow는 String에서 for문으로 일일히 박아줬고
fast는 StringBuilder를 사용해 일일히 append 해줬다.
결과는 보라

3. StringBuffer

사용법은 Builder랑 비슷함. 차이점은 멀티쓰레드 환경에서 난다. 그리고 속도는 Builder가 더 빠름

StringBuffer은 동기화처리를 해준다. 그래서 멀티쓰레드 환경에서 안전함, String보단 무겁다.
StringBuilder은 동기화 처리는 없는데 빠르긴 함. String보다 가벼움

1. append()

StringBuffer sb = new StringBuffer(); //객체 생성
sb.append("hello");
sb.append(" ");
sb.append("World");
String str = sb.toString();
System.out.println(str); //"hello World" 출력

추가해주는 메서드!

2. capacity()

StringBuffer의 현재 크기를 뱉는다.
비어있는 StringBuffer는 4임.
여기에 글자가 추가되면 글자수 만큼 ++ 된다!

3. delete()

delete(인덱스) 인덱스에 해당하는 문자열을 지워준다. 빈칸 포함으로 세야함

4. insert()

insert(인덱스, String) 인덱스 위치에 지정한 문자열을 추가한다.

profile
https://crazyleader.notion.site/Crazykwak-36c7ffc9d32e4e83b325da26ed8d1728?pvs=4<-- 포트폴리오

0개의 댓글