본문 바로가기

Back-End/JAVA

[자바] 문자열과 제너릭 (String & Generic)

04.20 자바 수업 9일차 

야심차게 블로그 시작해놓고 개념이 조금 어려워지고 많아지니까 임시저장 글만 늘어났다.

학원 단톡에 수강생분이 블로그를 공유해주셔서 블로그를 구경했는데 정리도 깔끔하시고,, 개념만 적기보단 사담도 적어놓으셨길래 나도 적어보았다. 

블로그를 개념 정리와 기록용으로만 생각해서 그런지 제대로 정리가 되지 않으면 글도 안올리고 임시저장만 하기를 벌써 4일째인데 완벽하게 하려하지 말고 어렵게 생각하지 말고 일단 그 날 배운 것은 그 날 올리기!를 목표로 다시 심기일전해봐야겠다!

그리고 오늘은 개념 이해 아주 잘한 것 같아,, 뿌듯 ㅎ

 

문자열

요약

  • String은 char 배열을 다루기 위한 class 이다.
  • String에는 문자열을 다룰 수 있는 여러 메서드 들이 존재한다.
  • String에서 문자열을 추가할 때마다 객체의 개수는 늘어난다.
  • 객체의 남발을 막기 위해 StringBuffer와 StringBuilder가 생겼다.
  • StringBuffer와 StringBuilder은 객체를 추가하면 객체의 크기는 커지지만 개수는 늘어나지 않고 하나의 객체이다.
  • StringBuffer와 StringBuilder의 차이점은 다수유저의 동시 접근을 허용하느냐(StringBuilder) 하지않느냐(StringBuffer) 이다.

 

String은 char 배열을 다루기 위한 class 이다. 

String이 char[] 와 같다는 것.

char의 배열이 String

String에는 문자열을 다룰 수 있는 여러 메서드 들이 존재한다.

자바에서 문자열을 다루기 위해 String 이라는 클래스를 만든 것이므로 String의 다양한 메서드들을 활용할 수 있다.

 

  • .charAt(인덱스)   => 인덱스 3의 값을 뽑아내는 것이므로 str에서 d가 출력된다.
  • .substring(시작인덱스,끝인덱스)   => 시작 인덱스 부터 끝 인덱스의 앞 인덱스까지!! ** 주의해야한다. 1부터 5로 써놓으면 4번 인덱스의 값까지만 출력된다.
  • .toCharArray()    =>  문자열을 배열로 변환

 

  • .split(기준)  : 기준으로 설정한 특정 문자에서 나눈다. 공백으로 설정할 수도 있다.

결과값은

str.split("/"); 의 결과값

  • .indexOf(특정문자(열)) / .lastIndexOf(특정문자(열))  :  특정문자가 있는 인덱스를 출력해준다. 단점은 앞/뒤에서부터 딱 하나만 찾아준다.

 

어떻게 모든 "c"를 찾을 수 있을까? 

=> indexOf로 c를 찾으면 해당 인덱스+1을 split에 넣어주어 잘라내고 남은 배열에서 indexOf로 c를 찾는 방법을 생각

=> 문제점은 인덱스값이 변동이 있다는 점!

 

여기서 내가 생각해내지 못한 것은 문자열은 문자들의 배열이라는 것이다.

배열은 인덱스로 하나씩 뽑아올 수 있다!

그러면 하나씩 뽑아와서 해당 인덱스의 값이 찾던 값이라면 인덱스를 출력하고 배열이 끝날 때까지 이 과정을 반복하면 된다.

 

r기본 프로그래밍 문법으로 해결한 방법

 

자바에서 기본으로 제공하는 메서드를 활용하는 방법도 있다.

  • 앞에서 봤던 .indexOf라는 메서드는 찾으려는 값의 인덱스를 알려주는데 찾는 값이 배열에 존재하지 않으면 -1을 반환한다. 

자바에서 기본으로 제공하는 메서드를 활용하는 방법

if문이 없다면 어떻게 될지 궁금해서 해봤는데 

무한반복.. 

 

String에서 문자열을 추가할 때마다 객체의 개수는 늘어난다.

객체의 남발을 막기 위해 StringBuffer와 StringBuilder가 생겼다.

StringBuffer와 StringBuilder은 객체를 추가하면 객체의 크기는 커지지만 개수는 늘어나지 않고 하나의 객체이다.

StringBuffer와 StringBuilder의 차이점은 다수유저의 동시 접근을 허용하느냐(StringBuilder) 하지않느냐(StringBuffer) 이다.

 

  • String

이렇게 String에 문자열을 추가하면 객체가 총 세 개가 되는 것.

  • StringBuffer와 StringBuilder

문자열을 추가해도 객체의 개수는 여전히 하나! 객체의 크기만 커진다.
차이점은 다수유저의 동시 접근 허용여부! 다수 유저의 동시접근은 멀티스레딩과 관련있는데 나중에 배운다고 한다.

다수유저 동시 접근은 말그대로 내가 객체를 사용할 때 다른 사람들도 접근하는 것을 허락할 것인지 나만 사용할 것인지 여부이다. 나중에 더 자세히 배운다고 한다.

 

 

Generic (제너릭)

요약

  • Generic은 객체화 시 객체에 들어갈 타입을 지정해준다.
  • Generic을 사용하면 데이터를 넣고 뺄 때 확인 작업(Casting)을 할 필요가 없다.
  • Generic으로 지정하는 타입은 class도 가능하다.
  • 지정할 타입이 여러개인 경우 class 타입으로 지정해주는 것이 유용하다.

 

Generic은 객체화 시 객체에 들어갈 타입을 지정해준다.

<이 안에 타입을 써넣어 지정해주는 것>

Generic을 사용하면 데이터를 넣고 뺄 때 확인 작업을 할 필요가 없다.

  • 택배를 받았을 때 송장이 있다면 택배를 열어보지 않아도 어디서 어떤 물건을 보낸 건지 알 수 있지만 송장이 없다면 택배를 열어보아야 안에 있는 물품이 무엇인지 알 수 있다. 송장과 같은 역할을 해주는 것이 Generic이다.

 

강사님이 주신 pdf

 

Generic 사용법은 Class나 interface 선언 시 <T>를 추가해주면 된다. 

T는 Type Parameter의 약어일 뿐 꼭 T를 사용할 필요는 없다.

여러개의 Type을 사용하려면 콤마로 구분해주면 된다. <A,B,C,D> 이런 식.

 

Generic으로 지정하는 타입은 class도 가능하다.

지정할 타입이 여러개인 경우 class 타입으로 지정해주는 것이 유용하다.

 

여러개의 Type을 사용하는 경우(왼쪽) 와 class 타입으로 지정해서 사용해주는 경우 (오른쪽)

info 클래스를 타입으로 지정해주면 만들어야 할 파일은 3개가 되지만 타입들을 info안에서 관리하기 때문에 더 편리하다.

Main.java에서 사용할 때도 코드가 더 보기쉽고 데이터 타입을 헷갈리지 않고 사용할 수 있다.

클래스 타입으로 사용할 때의 장점을 이해하기 쉬운 그림이 있다.

큰 상자(Info) 안에 작은 상자(변수)들을 넣으면 꺼낼 때와 넣을 때 큰 상자에서 작은 상자들을 꺼내야하는 과정을 거쳐야하지만 들고 옮기기(관리)에는 큰 상자 하나를 드는 것이 작은 상자들을 쌓아 옮기는 것보다 쉽다.

 

 

 

오늘 처음 코드리뷰를 해봤는데 머리로 이해하고 있는 것을 주석으로 설명하기가 참 어려웠다. 또 해당 코드를 쓴 이유를 하나하나 뜯어보게 되니 모르고 있던 부분도 잡아낼 수 있었다.

아직 명확하게 설명하지 못하는 부분은 if문의 조건에 왜 intResult > -1이 들어가는지!!!! 이해는 하는데 명확하게 말과 글로 풀어내기가 쉽지 않다. 

2022-04-20