자바에서 print와 scan을 소개하기 전에 객체지향 프로그래밍의 간단한 개념을 알아야할 것 같다.
먼저 C언어에서의 함수(Java에서는 메소드)는 main함수 안에서 바로 사용할 수 있었다.
그런데 자바 파일을 보면 다른 점이 있다.
main이라는 함수 앞에 public static가 붙어있고 파라미터도 있지만 그 외곽은 class가 감싸고 있다.
간단히 말하면 자바에서 모든 함수(메소드)는 클래스 안에서 사용해야 한다.
그리고 이 클래스는 일종의 설계도면이라고 할 수 있다.
C언어의 구조체 선언은 어떤 역할이었는지 다시 떠올려보자.
struct AAA {
int a;
double b;
};
main함수 위에 이런 구조체를 선언했다면 우리는 a와 b라는 변수를 만든 것일까?
아니다. 이 구조체는 자료형을 설계한 것이므로 사용하는 main함수에서 선언되어야 비로소 AAA의 a, b라는 변수를 만든 것이다.
자바에서 클래스는 C언어의 구조체와 비슷하지만 변수뿐 아니라 함수까지 가질 수 있다.
그리고 다른 클래스를 사용할 때는 메모리(RAM)에 객체로 생성하여 참조변수를 통해 사용해야 한다.
메모리에 객체를 생성한다는 의미가 어려울 수 있을 것이다.
C언어에서 malloc(sizeof(int));를 하면 4byte짜리 heap메모리 공간을 할당받는 것인데
이 때 malloc을 사용하면서 포인터로 제어해주지 않으면 아무런 소용이 없는 코드가 되듯이
자바에서도 객체를 생성할 때 포인터 변수와 같은 참조변수를 통해 객체를 제어해주어야 한다.
왜냐하면 자바에서 객체를 생성할 때 heap메모리에 생성하기 때문이다.
처음 사용해볼 'String은 무조건 객체'이다.
String s;
int a;
s = new String("Hello");
먼저 위의 코드를 살펴보도록 하자.
나는 String s를 선언했다. 이는 내가 문자열 객체를 만든 것일까??
아니다. s라는 참조변수를 만든 것이다. 다시 말해 String형 참조변수를 만든 것이다.
무슨 소리인가 싶을 수 있다. 클래스는 자료형을 설계한 것과 비슷하다고 했다.
그래서 String형 s라는 참조변수를 선언했다고 한 것이다. 바로 아래 줄 코드를 보면 int a를 선언했다. 이를 설명할 때는 어떻게 할 것인가?
다들 int형 a라는 변수를 선언했다고 설명할 것이다. 이와 같은 원리이다.
그럼 나는 아직 s라는 참조변수만 만들었고 객체를 만들지 않았다.
그래서 다음 줄을 보면 s에 new String("Hello");를 대입했다. 이는 s라는 변수에 Hello라는 문자열을 때려박은 것이 아니다.
참조변수는 포인터 변수와 같다고 위에서 설명했다. 그럼 s는 대체 무슨 값을 가지고 있을까?
객체의 주소 값을 가지고 있다. 내가 Hello라고 문자열 객체를 만들었는데 이 주소를 가지고 있는 것이다.
그럼 new는 대체 무슨 문법인가 싶을 수 있다.
new는 C언어의 malloc과 같이 메모리를 동적 할당하는 키워드이다. (물론 malloc은 함수이지만)
그래서 내가 new String("Hello")를 한 것은 String객체를 생성한 것이다.
위에 만들어둔 문자열을 먼저 출력해보려고 한다.
System.out.println("Hello");
System.out.println(s);
첫 문장처럼 바로 문자열을 출력할수도 있지만 아까 우리가 s라는 참조변수를 통해 "Hello"를 가진 String 객체를 출력할 수 있다.
여기서 또 이상하다고 느끼는 사람이 있을 것이다.
s는 참조변수, 즉 포인터 변수이므로 객체의 주소 값을 가지고 있다.
그런데 println을 했더니 주소가 출력되지 않고 "Hello"가 출력됨을 알 수 있다. 왜 그럴까?
System.out.println 함수의 파라미터 안에 그냥 문자열 참조 변수만 쓰면 자동으로 .tostring()을 해주기 때문이다.
그래서 아래에 있는 두 줄의 코드는 같은 내용이다.
System.out.println(s);
System.out.println(s.toString());
다시금 찝찝함을 느끼는 사람들이 있을 것 같다.
System.out.println("Nice");
이런 문장은 다시 생각해보면 이상하다. 분명 문자열은 객체라고 설명했는데 나는 "Nice"라는 문자열을 객체로 생성한 적이 없기 때문이다.
사실 String은 조금 특이한 친구이다.
String str = "Nice";
String str = new String("Nice");
누가봐도 이 두 문장은 다르다. 하지만, 자바에서는 첫 문장처럼 String 객체를 생성할 수 있다. String만이다.
그래서 사실 첫 문장은 객체를 생성하지 않은 것이 아니라 자바가 자동으로 new String을 해준 것이다.
다음 글에서 소개할 클래스이지만 먼저 아주 짧은 예를 보여주려 한다.
Scanner sc = new Scanner(System.in);
Scanner클래스를 객체로 만들면서 sc라는 참조변수에 주소를 대입했다.
String과 달리 new 키워드를 이용해 객체를 생성한 모습을 확인할 수 있다.
'Language > Java' 카테고리의 다른 글
Java에서의 String 소개 - 1 (0) | 2022.02.09 |
---|---|
Java의 print와 scan (0) | 2022.02.03 |
Java 참조 자료형과 출력 예제 (0) | 2022.01.29 |
Java 기본 자료형 - 2 (0) | 2022.01.28 |
Java 기본 자료형 - 1 (0) | 2022.01.27 |