문자열 11

[JAVA] 자바의 String과 StringBuffer

오늘은 String과 StringBuffer의 차이점에 대해서 공부해보도록 하겠습니다. String 지난 포스팅에서도 설명했지만 String은 불변성(immutable)을 가지고 있습니다. 불변성이란 말 그대로 변하지 않는 것을 의미합니다. 그래서 데이터가 한번 생성되고 나면 그 뒤에는 변하지 않습니다. String이 한번 선언되면 변하지 않는다니 뭔가 잘 이해가 안되시죠 간단한 코드로 알아봅시다. String s = "Hello"; System.out.println(s.hashCode()); s += ", Java"; System.out.println(s.hashCode()); System.out.println(s); 결과를 보면 s를 출력했을때의 연산은 잘 나왔지만 주소값이 앞에 두 개가 다른 것을 ..

Java/JAVA 2021.09.19

[JAVA] String pool

자바에서 String은 참조 타입이지만 기본 타입처럼 사용이 가능합니다. String은 불변성을 가지고 있기때문에 String이 아닌 다른 타입과 연산을 할 경우 String 타입으로 인식하게 됩니다. 간단한 코드를 통해 쉽게 알아보겠습니다. package test; public class Test { public static void main(String[] args) { String s = "Java"; String h = "Java"; String newS = new String("Java"); System.out.println(s + 1 + 2); System.out.println(1 + 2 + s); System.out.println(s); System.out.println(h); System...

Java/JAVA 2021.09.18

[CS50] 문자열 복사

지난 포스팅에서 문자열이 메모리에 어떤 방식으로 저장되어있는지, 또 어떻게 불러오고 비교하는지에 대해 공부해봤습니다. 그렇다면 문자열을 다른 곳에 복사할 때는 어떤 방법을 써야 하는지 공부해보도록 하겠습니다. 아래와 같이 문자열이 어떻게 복사가 되는지 보기위해 아래와 같이 문자열을 복사해서 첫 문자를 대문자로 바꾸는 코드를 작성해 보겠습니다. #include #include #include int main(void) { string s = get_string("s: "); string t = s; t[0] = toupper(t[0]); printf("s: %s\n", s); printf("t: %s\n", t); } 처음 입력은 emma로 전부 소문자로 입력한뒤 결과를 봤는데 t뿐 아니라 s까지도 대문자..

CS 기초/메모리 2021.08.22

[CS50] 문자열 비교

오늘은 문자열이 두 개일 때 같은 내용을 담고 있는지?, 또 이 두 개가 직접적으로 비교가 가능한지에 대해 공부해보도록 하겠습니다. 지난 포스팅에서 문자열은 각 문자의 배열이고 각 문자는 메모리에 서로 다른 주소 값을 가지고 있다는 것을 공부했습니다. 실제로 확인해보면 #include int main(void) { char *s = "EMMA"; printf("%p\n", &s[0]); printf("%p\n", &s[1]); printf("%p\n", &s[2]); printf("%p\n", &s[3]); } 이렇게 코드를 작성하고 실행했을 때 주소값이 다르게 출력되는 것을 확인할 수 있습니다. ** 여기서 주소값을 보면 첫 번째 문자인 "E"를 시작으로 메모리상에 바로 옆에 저장되어있는 것을 볼 수 ..

CS 기초/메모리 2021.08.21

[CS50] 문자열

지금까지 문자열을 string이라는 자료형을 사용해 저장해왔습니다. 그런데 C에는 string이 실제로 존재하지 않는 자료형이라고 합니다. 그렇다면 문자열이 실제로 메모리상에 어떻게 저장되어있는지, 저장되어있는 문자열에 어떻게 접근해야 하는지 공부해보도록 하겠습니다. 지금까지 배우면서 문자열을 변수에 저장하기 위해 CS50 라이브러리에 있는 string 자료형을 사용해왔습니다. 예전부터 문자열은 문자의 배열이라고 배웠는데 만약 string s = "EMMA"; 라는 코드가 있다면 그림과 같이 s[0], s[1], ... 처럼 하나의 문자가 배열의 한 부분을 차지하고 마지막엔 \0인 null 종단 문자로 문자열의 끝을 나타내 줬습니다. 그렇다면 문자열의 주소는 어떻게 가리키게 될까요?? 위의 변수 s는 이..

CS 기초/메모리 2021.08.20

[CS50] 문자열의 활용

지금까지 문자열의 기본적인 개념들을 학습해봤습니다. 이번 포스팅에서는 문자열을 활용하여 특정 문자를 다른 문자로 치환하거나 문자열 안에 포함되어있는 문자를 검색해보는 방법에 대해 공부해보도록 하겠습니다. 문자열의 길이 및 탐색 사용자로부터 문자열을 입력받아 문자열을 출력하기 위해서는 문자열의 끝을 알아야합니다. 그렇다면 정해지지 않은 문자열의 끝은 어떻게 알 수 있을까요? 문자열의 끝을 알수있는 방법 중 하나는 인덱스의 문자가 종단 문자(\0)와 일치하는지 검사하는 것입니다. for (int i = 0; s[i] != '\0'; i++){ ..... } s라는 문자열이 있다고 했을 때 이런 식으로 길이를 구할 수 있습니다. 다른 방법은 strlen( )이라는 함수를 사용하는 것입니다. #include #..

CS 기초/배열 2021.08.09

[CS50] 문자열과 배열

C뿐 아니라 많은 프로그래밍 언어들은 문자열을 저장하기 위해 string 자료형을 사용했습니다. 문자열이라는 단어는 문자가 나열되어있다. 즉 배열되어있다.라는 의미로 추측해볼 수 있는데요. 이런 관점에서 string 자료형이 C에서 어떻게 정의되어있는지 배열과 관련해서 공부해보도록 하겠습니다. string은 말 그대로 문자(char)의 배열이었습니다. 만약 string s = "HI!"; 로 정의되어 있다면 s는 문자열이기 때문에 메모리상에 'H', 'I', '!'로 저장되어 있을겁니다. 그런데 사실 문자열은 저번 포스팅에서 설명했듯이 길이가 정해져 있지 않기때문에 메모리의 크기 역시 정해져있지 않습니다. 그럼 string이 연속으로 정의되어있다면 어떻게 구분할까요?? 그래서 string에는 종단 문자인..

CS 기초/배열 2021.08.08

[CS50] 문자열

모든 언어가 그렇듯 문자열을 다루기 위해서는 문자열 형식을 가진 변수부터 선언해줘야 합니다. 오늘은 사용자로부터 문자열을 입력받고 입력받은 문자열을 다른 문자열과 합쳐서 출력하는 프로그램을 작성해보겠습니다. 혹시나 실습이 필요하신분들은 https://sandbox.cs50.io/ CS50 Sandbox Temporary programming environments for students and teachers. sandbox.cs50.io 여기서 바로 create눌러서 시작하시면 실습하기 수월합니다. 이렇게 만들어진 스크래치 블록이 있다고 한다면 C로는 어떻게 표현해야 할까요? 지난 포스팅에 say는 printf와 같은 역할을 한다고 공부했습니다. 그렇다면 ask는 어떨까요? ask함수를 C로 가져왔을 ..

CS 기초/C언어 2021.07.29

[Baekjoon] 백준 2908 상수 - java

오늘은 저번과 마찬가지로 문자열 문제인 상수를 풀어보려 합니다. 브론즈 2문제지만 설명을 보고 생각나는 게 로직이 있었는데 좀 더 쉽게 풀 수 있을 거 같아서요 ㅎㅎ 저번에서 설명했듯 이번부터는 최대한 Scanner를 사용하지 않고 풀어보려고 합니다. 그럼 문제풀러 가볼까요? 문제는 https://www.acmicpc.net/problem/2908 2908번: 상수 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 www.acmicpc.net 여기서 확인하시면 됩니다. 문제풀이 package Baek; import java.io.BufferedReader; import..

Algorithm/Baekjoon 2021.07.23

[Baekjoon] 백준 1152 단어의 개수 - java

오늘은 문자열에서 브론즈 2 문제인 단어의 개수 문제를 풀어보려 합니다. 이번 문제는 처음에 생각 없이 풀어봤는데 실패라고 뜨길래 뭘 실수했지 곰곰이 생각해보게 되는 문제였던 거 같아요 어떤 문제인지 문제 풀러 가보겠습니다. 문제는 https://www.acmicpc.net/problem/1152 1152번: 단어의 개수 첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 www.acmicpc.net 여기서 확인하시면 됩니다. 문제풀이 package Baek; import java.util.Scanner; public class Main { public stat..

Algorithm/Baekjoon 2021.07.21