쌍용교육센터에서 공부한 내용을 정리하며 기록하는 글이고 주관적인 생각이 들어갈 수 있습니다.
잘못된 내용이나 피드백 및 생각 공유는 언제든 환영입니다.
댓글로 남겨주시면 확인 후 수정하겠습니다.
문자열(String)
- "로 시작되는 여러 문자들
- String은 문자열 저장소에 저장된다.(동일한 문자열은 저장하지 않는다.)
- 동일한 문자열은 하나만 생성된다.
- String의 시작 주소를 저장하는 데이터형 java.lang.String 클래스이다.
- "" : 문자열 상수는 java.lang.String의 method를 사용할 수 있다.
- java.lang.String
- 문자열 상수의 시작 주소를 저장할 수 있는 클래스
- 참조형(new) 데이터형이지만 기본형(new 사용X) 형식으로 사용할 수 있다.
- 기본형과 참조형의 문법에 따라 생성되는 메모리가 다르다.
- String str = "문자열"; (기본형 형식)
- String str = new String("문자열"); (참조형 형식)
- new가 들어가면 heap(참조형) , new가 들어가지 않으면 stack(기본형)
비교(==) : 기본형 => 사용 값이 같은지?, 참조형 => 사용 주소가 같은지?
String str = "abcd";
String str1 = new String("abcd");
str = 기본형으로 설정해서 스택에서 문자열 저장소의 시작주소를 가지고 있다.
str1 = 참조형으로 설정해서 스택에서 힙의 스트링 생성자의 시작주소를 가지고 있다.
String str == "abcd";
String str은 기본형으로 만들었기 때문에 문자열 저장소 주소를 가지고 있다.
"abcd";는 문자열 저장소 주소를 가지고 있다.
str은 기본형 형식으로 만들었으니 문자열 저장소 주소가 저장돼 있기 때문에 true가 나온다.
String str1 = new String("abcd");
String str1은 참조형으로 만들었기 때문에 heap의 주소를 가지고 있다.
"abcd";는 문자열 저장소 주소를 가지고 있다.
str1은 참조형 형식으로 만들었으니 str1에는 heap에 주소가 저장돼 있기 때문에 false가 나온다.
str와 str1의 참조 시작 주소가 다르기 때문에 문자열에 대한 값을 비교를 원하면?
=> equals로 비교한다.
변수명.equals("비교할 문자열")
참조형인 경우 heap 안에 있는 문자열 주소와 문자열 저장소 주소를 비교한다.
기본형 형식, 참조형 형식 모두 같은 결과를 반환한다.
인스턴스 메소드는 객체명.메소드명으로 불러와야 하고
스테틱 메소드는 클래스명.메소드명으로 불러와야 한다.
클래스는 동사적, 명사적으로 구분하는 게 중요하다.
String 클래스 사용
1. 생성자를 사용해 객체를 생성해라.
String 클래스에서 API 문서를 보면 오버로딩이 되기 때문에 참조형은 아래와 같이 생성자를 사용 가능하다.
String str = new String(); //기본 생성자 사용(참조형)
String str = new String("문자열");//Overload된 생성자 사용(참조형)
String str = "문자열";(기본형)
2. 객체가 제공하는 일 사용하려면 클래스 안의 method를 사용한다.
문자열의 길이를 알고 싶을 때는 length() 메소드를 사용한다.
예를 들어 int cnt = str.length(); 로 사용하면
cnt 변수에 str의 글자 수의 값이 대입된다.
String str = "abcdEF" 일때
대문자로 변환하려면 toUpperCase()를 사용한다.
str.toUpperCase()로 출력하면 "ABCDEF"로 출력된다.
소문자로 변환하려면 toLowerCase()를 사용한다.
ex. str.toLowerCase()로 출력하면 "abcdef"로 출력된다
문자열 안에서 특정 문자의 인덱스를 얻기 위해서는 str.indexOf("문자열")을 사용한다.
인덱스는 0부터 시작하기 때문에
str.indexOf("c")를 출력하면 2가 출력된다.
str.indexOf("E")를 출력하면 4가 출력된다.
여러 문자열일 때에는 문자열이 존재한다면 문자열 시작 인덱스를 얻는다.
str.indexOf("dEF")를 출력하면 d의 인덱스 값 3이 출력된다.
뒤에서부터 문자열 안에서 특정 문자의 인덱스를 얻기 위해서는 str.lastIndexOf("문자열")을 사용한다.
str.lastIndexOf("b")를 출력하면 1이 출력된다.
indexOf("문자열")나 lastIndexOf("문자열")에서 찾는 인덱스가 없으면 -1이 출력된다.
str.indexOf("a", i)이면 i부터 마지막까지 첫 번째 a의 인덱스를 얻는다.
(개인적으로 이 부분이 조금 헷갈렸다.)
특정 인덱스에 해당하는 문자를 얻으려면 charAt()를 사용한다.
String str = "AbcdEF";일 때
str.charAt(2)로 str의 2번째 문자를 불러온다. (char 형)
str="AbcdeF"에서
System.out.println(str); println;를 실행하면 문자열 저장소의 시작 주소를 받아 끝 기호까지 출력한다.
문자열에선 끝 기호이 저장되어 있다. 끝 주소는 눈에 보이지 않는다.
자식 문자열을 얻으려면 substring()을 사용한다.
str.substing(1,3) 이면 bcd가 아니라 bc를 얻는다.
str.substring(시작 인덱스, 끝 인덱스+1)를 해야 원하는 시작과 끝의 인덱스를 가져 올 수 있다.
왜 끝 인덱스 +1를 해야 하냐면 잘려진 문자열은 문자열의 끝 기호가 없다.
출력한다고 하면 끝 기호가 없기 때문에 어디까지 출력해야 하는지 인식을 못 한다.
그래서 끝 기호를 설정해야 한다. 그래서 제일 마지막 문자에 끝 기호를 덮어 쓴다.
그래서 자르기 원하는 문자열의 마지막 인덱스에 1을 더해 설정해야 한다.
응용을 하자면 subString(mail.indexOf("@"),mail.length();의 경우에는 mail의 처음부터 끝까지
@가 처음으로 나오는 인덱스를 찾아서 메일의 글자 길이까지의 값을 얻는 것이다.
subString(시작 인덱스) 같이 ,(컴마)가 없는 경우에는 시작 인덱스부터 끝까지 출력된다.
문자 붙이는 방법은
+ 기호 사용하는 방법과 문자열을 결합시키는 메소드 concat()이 있다.
+ 기호 사용하는 방법으로는
String str = "안녕";
String str1 = "하세요?";
String result = str+str1;
하면 "안녕하세요"라는 값을 result는 갖는다.
문자열을 결합시키는 메소드 concat()을 사용하는 방법으로는
concat("연결할 문자열")
String str = "안녕";
String result = str.concat("하세요");
하면 "안녕하세요"라는 값을 result는 갖는다.
문자열에 앞, 뒤 공백(white space) 제거하는 메소드는 trim()이고
사용하는 방법은
String str=" a bc ";
str.trim()
하면 "a bc"라는 값이 나온다.
문자열을 치환할 때 쓰는 메소드는 replaceAll()이고
사용하는 방법은
String str = "AbcdE";
replaceAll("찾을 문자열", "치환할 문자열")
str.replaceAll("bcd,"java");
하면 "AjavaE" 값이 나온다,
특정 문자열로 시작하는 지를 확인하는 메소드는 startsWith()이고
사용하는 방법은
String str="java";
str.startsWith("문자열")
하면 boolean값이 나온다. (맞으면 true 틀리면 false)
특정 문자열로 끝났는 지를 확인하는 메소드는 endsWith()이고
사용하는 방법은
String str="java";
str.endsWith("문자열")
하면 boolean값이 나온다. (맞으면 true 틀리면 false)
특정 문자열을 포함 지를 확인하는 메소드는 contains()이고
사용하는 방법은
String str="java";
str.contains("문자열")
하면 boolean값이 나온다. (맞으면 true 틀리면 false)
기본형 데이터 형을 문자열로 저장하는 메소드는 valueOf()이다.
사용하는 방법은
int i = 10;
String.valueOf(기본형 데이터형)
String str = String.valueOf(i)
하면 str에 10은 문자열로 저장이 된다.
str.isEmpty()은 값이 비어 있는지 확인해주는 메소드이다.
String 클래스의 메소드들을 많이 알아보았다.
이젠 array에 대해 알아보자.
array(배열)
하나 씩 하는 거 보다 한꺼번에 일괄 처리하면 속도 향상에 좋다.
배열은 일차원 배열, 이차원 배열, 삼차원 배열, 가변 배열 4가지 배열을 제공한다.
고정 길이 형으로 배열의 개수(방(element)의 개수)를 설정하면 변경되지 않는다.
모든 데이터형으로 만들 수 있다 그 중에 참조형 데이터로 배열을 만들면 객체 배열이라고 한다.
또한 배열은 메모리에 동일 데이터 형을 연결하여 생성하는 것이다.
일차원 배열은 하나의 행에 열로만 구성된 배열이고
방의 개수는 배열명.length로 얻을 수 있다.
일차원 배열 사용법 순서
1. 선언
데이터형[] 배열명 = null;
ex. int[] arr = null; (참조값이 없을 때는 null값으로 선언해야 한다.)
arr가 스택에 null 주소값 저장한다.
2. 생성
배열명 = new 데이터형[]
new 생성 연산자는 heap에 생성되고 모든 방의 값은 자동 초기화된다.
ex. arr = new int[4];
해석을 하면 힙에 인트형으로 (Element)방을 4개 만들고 그 시작 주소 넘겨줘라는 의미이다.
배열의 인덱스는 0부터 시작해서 0123 순서로 만들어지고
배열의 인덱스는 배열의 방에 접근할 때 사용한다.
3. 생성된 방 값 할당
인덱스로 특정 방을 건드려서 값을 넣어 준다.
배열명[인덱스] = 값;
ex. arr[0]=12;
0번 인덱스의 방에 값12 대입한다는 의미이다.
4. 방의 값 얻기
배열명[인덱스]
arr[0]를 출력하면 12가 나온다.
또한 방의 갯수를 얻고자 하려면 arr.length로 얻을 수있다.
배우고 느낀 점
api문서들을 보면서 클래스를 보고 그 안에 있는 생성자를 보는 습관을 길러야겠고
그 안에 있는 기능에 맞는 메소드를 읽는 연습을 해야겠다. 스트링 클래스에 있는
여러 메소드들을 만져 보면서 이 것들을 활용하면 다양한 것들을 할 수 있겠다고 생각했다.
메소드 만들고 그 안에서 switch문이나 if문을 주어서 스트링 클래스의 메소드들을 만져 보았다.
그리고 break랑 return을 같이 써보면서 return값을 설정하면 메소드에서 나가지는 것과
break는 반복문이나 swtich문에서 사용 가능하다는 것을 알고는 있었지만 작성해보면서
자세히 알게 되었다.