본문 바로가기
  • 비둘기다
  • 비둘기다
  • 비둘기다
코딩/JAVA Basics

[자바 JAVA] 참조 변수, 문자열, 배열

by parzival56 2022. 12. 4.

차례

1. 참조란?

2. 문자열

3. 배열

 

데이터 타입의 분류와 '참조'

데이터 타입은 크게 2가지가 존재합니다. 바로 기본 타입과 참조 타입입니다.

기본 타입은 우리가 아는 정수형, 실수형, 논리형(boolean)이 해당합니다. 그리고 참조 타입에는 배열, 열거, 클래스, 인터페이스가 있습니다. 이렇게 둘을 나누는 이유는 타입 별로 변수가 저장되는 방식이 다르기 때문입니다. 

 

기본 타입부터 말씀드리자면 만약 기본 타입을 선언하게 되면 변수의 이름과 값이 스택 영역에 저장됩니다. 스택은 간단하게 말씀드리자면 하나의 저장 장법입니다. 스택은 아파트에 층을 쌓는 것과 유사합니다. 처음 선언하는 변수는 스택의 가장 위로 들어와서 1층 즉 가장 밑에 자리합니다. 그리고 변수를 선언하는 순서대로 위로 차차 쌓이게 됩니다. 

 

참조 타입 같은 경우에는 객체의 번지를 참조시키는 타입입니다. 참조 타입의 변수가 선언되면 실제 변수의 값은 힙 영역에 특정 번지수를 가지고 저장됩니다. 그리고 변수의 이름은 스택에서 해당 값의 번지수를 가지고 저장됩니다. 

int age = 25;
double price = 100.5;
String name = "신용권";
String hobby = "독서";

참조를 하는 과정은 꽤 포인터와 유사합니다. 기본 타입들은 모두 변수의 값을 스택에 저장해서 만약 변수를 불러내면 스택 내에 있는 값들을 통째로 불러오면 되지만 참조 타입 변수는 먼저 main이든 어디서 변수를 불러오면 먼저 스택에 접근하여 변수명을 찾은 뒤 옆에 번지수를 힙 영역으로 찾아가서 값을 불러온다는 것입니다. 

 

참조 변수의 연산에는 ==, !=가 있습니다. 이 두 비교 연산자는 '참조'된 값과 다른 참조 변수를 비교하여 같은지 다른지를 true와 false로 반환하는 연산자입니다.

 

문자열

문자열은 흔히 String 타입이라고 부릅니다. 문자열이란 오직 문자로만 이루어진 배열을 뜻합니다. 이는 즉 만약 "1년"이라는 단어를 String 타입의 변수에 저장하면 여기서 1은 정수임에도 문자로 저장된다는 것입니다. 

문자열은 new String();으로 생성하여도 되고 그냥 변수에 "넣고 싶은 문자열"을 적은 후 생성해도 상관없습니다.

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

위에 보이는 대로 문자열은 크게 2가지 방법으로 생성할 수 있습니다. 그러나 3가지 예시를 든 이유는 이들이 실제로 컴퓨터에 저장되는 방식이 모두 다르기 때문입니다. 

먼저 처음으로 생성한 s1은 스택 영역에 s1이라는 이름과 "hello"라는 문자를 가리키는 힙 영역의 번지수를 저장합니다. 이 힙 영역에 있는 "hello"를 String 객체라고 합니다.

그리고 그다음 생성한 s2는 new String() 없이 그냥 생성하였고 값이 s1과 완전히 같습니다. 그러면 s2는 s1과 같이 스택 영역에 저장되지만 아까 s1이 가리키는 String 객체를 참조하게 됩니다. 즉, 처음에 생성한 "hello"라는 String 객체를 참조하는 변수가 2개라는 것입니다.

그러나 마지막 s3는 값은 같지만 new String()를 통해 생성하였습니다. 스택 영역의 과정은 생략하고 여기서 s3의 값은 힙 영역의 새로운 번지에 String 객체를 생성하여 값이 저장됩니다. 정리하자면 s1, s2가 가리키는 String 객체 하나 그리고 s3가 가리키는 String 객체 하나 총 2개가 존재합니다. 같은 값을 가진 변수를 생성할 일이 그리 많지는 않지만 new String()으로 생성한 변수는 좀 더 독립적으로 다룰 수 있다는 점에서 일반적인 생성과는 차이가 있다고 할 수 있습니다. 

 

위에서 참조 변수를 설명하며 ==과 !=에 대하여 언급을 하였습니다. 이를 문자열에 대입해본다면 두 문자열의 내용이 같은지 검사하는 것이 아닌 동일한 객체인지를 검사하는 것입니다. 

앞선 s1, s2, s3를 토대로 예를 들자면 s1 == s2라면 true를 반환할 것입니다. 왜냐하면 이들은 같은 String 객체를 가리키기 때문입니다. 그러나 s1 혹은 s2 == s3라고 하면 false가 반환됩니다. 모두가 같은 값이라 할지라도 메모리 내에 저장되어 있는 곳이 다른 즉, 서로 다른 객체이기 때문입니다. 예로 들자면 동명이인인 사람인 셈이죠. 김철수가 2명이라고 했을 때 이들은 이름만 같은 뿐 사는 지역, 생년월일 등이 모두 다르기 때문에 완전히 다른 사람으로 취급하는 것과 같습니다.

 

String에 대해서 많은 메서드들이 존재합니다. 

대표적으로는 compareTo(String s), compareToIgnoreCase(String s), equals(String s), equalsIgnoreCase(String s)가 있습니다. 옆에 ignorecase가 있는 메서드는 문자열 간의 대소문자 구분을 없앤다는 뜻입니다. 

먼저 compareTo는 문자열을 사전 순으로 비교하여 정수 값을 반환합니다. 그리고 equals는 문자열을 비교한 후 true or false로 반환합니다. 

String s1 = "Hi, Java!";
String s2 = new String("Hi, Java!");
String s3 = new String("Hi, Code!");
String s4 = new String("Hi, java!");

// 출력문 형식은 생략
s1.equals(s2) // true
s1.equals(s3) // false
s1.equals(s4) // false
s1.equalsIgnoreCase(s4) // true

s1.compareTo(s3) // 7
s1.compareToIgnoreCase(s4) // 0
s3.compareTo(s4) // -39

String 관련 메서드

그리고 이러한 추가적인 메서드도 활용하여 문자열을 조작할 수 있습니다.

예를 들어 특정한 문자열을 입력받고 그  문자열에 대문자 개수가 몇 개인지 출력하는 예제가 있습니다. 

 

배열

배열은 문자열의 포괄적인 개념이라고 할 수 있습니다. 배열은 문자열이 문자 만을 취급하는 것처럼 '같은 타입'의 데이터를 연속적으로 저장합니다. 그리고 각 데이터의 저장 위치를 인덱스 번호를 통해 접근합니다. 

배열을 사용하는 이유는 많은 양의 같은 타입의 변수를 한 번에 묶어 처리하기 위함입니다. 예를 들어 int n1, n2, n3, n4, n5가 있을 때 이를 선언하러면 복잡하고 관리도 힘듭니다. 그러나 이를 n이라는 배열이 모두 묶어 저장할 수 있기 때문에 훨씬 편리하다고 할 수 있습니다. 

배열을 선언하는 방법은 다양합니다. 

먼저 값을 다 적어 생성하는 방법이 있습니다. 

1. 타입 [] 변수 = { 값 0, 값 1, 값 2.......};

2. 변수 = new 타입[] {값 0, 값 1, 값 2...........};

여기서 주의할 점은 이렇게 생성할 시 무조건 값들을 선언을 하면서 적어야 한다는 점입니다. 

예를 들어 타입[] 변수;를 선언하고 다음 줄에 변수 = {값 0, 값 1, 값 2.....}라고 하면 컴파일 에러가 납니다. 

 

다음은 new연산자를 이용하여 배열을 생성하는 방법입니다.

1. 타입[] 변수 = new 타입[길이];

2. 타입[] 변수 = null; 변수 = new 타입[길이];

주로 첫 번째 경우를 사용하는 것이 편리합니다. 이와 같은 경우에는 값들을 선언하지 않았기 때문에 빈 인덱스들에 모두 null값이 들어가게 됩니다. 이들은 주로 배열의 크기만 선언해놓고 값들을 입력해서 채울 때 등 많이 사용합니다. 

 

배열의 길이는 .length로 얻을 수 있고 이는 주로 쓰기가 아닌 읽기 전용입니다. 즉, 출력해서 본다거나, 조건 안에 넣어 사용한다 등입니다. 

배열은 한 번 생성하면 크기는 변경이 불가하기 때문에 저장 공간을 늘리기 위해서는 더 큰 배열을 만들고 이들을 모두 붙여 넣는다던지, 문자열이라면 조작을 통해 간접적으로 늘리던지 등의 조치를 취할 수 있습니다. 

 

향상된 for문은 이전의 for문과 역할은 같지만 형식이 다릅니다.

for (int s : scores)
	sum += s;

별도의 중괄호 없이 위가 끝입니다. 대신 반복 조건에서 : 다음에는 무조건 배열이나 컬렉션이 들어갑니다. 이는 배열에서 인덱스의 개수만큼 반복한다는 것을 쓰는 대신 위와 같은 형식을 취합니다. 

 

동적 배열 ArrayList

동적 배열은 일반적인 배열과는 달리 형식도 다르지만 색다른 원소 접근 방식을 통해 편리하게 배열을 편집할 수 있습니다.

선언 형식은 ArratList<참조 타입> 참조 변수 = new ArrayList<>(); 입니다. 참조 타입은 일반적인 int, double이 아니라 Integer, Double, Character 등의 기초 타입을 의미합니다. 

그리고 이 배열의 접근을 위한 용어로는 .add(인덱스), .remove(인덱스), .get(인덱스), .size(인덱스)가 있습니다. 

 

이상 참조변수, 문자열, 배열에 대해 알아봤습니다.

 

'코딩 > JAVA Basics' 카테고리의 다른 글

[자바 JAVA] 다형성  (0) 2022.12.05
[자바 JAVA] 상속  (0) 2022.12.05
[자바 JAVA] 클래스와 객체  (2) 2022.12.05
[자바 JAVA] 변수, 자료형, 연산자  (0) 2022.11.07
[자바 JAVA] 자바의 기초 상식  (0) 2022.10.21

댓글