본문 바로가기

Java

(47)
[Java] 11.03 - String 클래스의 메소드(1) 들어가며 String 클래스에는 문자열 처리에 부족함이 없을 정도로 많은 메소드가 정의되어 있다. 그리고 대부분의 메소드들이 사용하는데 어려움이 없다. 자바 문자를 참고해야 한다. 이어서 String 클래스에서 주로 사용하는 기본적인 메소드들을 소개할 예정이다. 그러나 어떠한 책에서도 String 클래스의 모든 메소드를 소개하지는 않는다. 그리고 자바의 모든 클래스를 설명한다는 것은 더더욱 불가능한 일이다. 때문에 자바 사용자들은 JDK 문서를 참고하는 습관을 들여야 한다. 지금까지 한 번도 JDK 문서를 참고하지 않았다면 지금을 기회로 삼자. 본서에서 설명하는 String 클래스의 메소드들을 문서를 통해서 다시 한번 확인하자. 조금 더 조언하자면, 저자도 90년대 후반에 자바의 기본 문법은 책을 통해서..
[Java] 11.02 - String 클래스 들어가며 자바에서는 String이라는 이름의 클래스를 정의하여 제공하고 있다. 그리고 이 클래스의 목적은 문자열 표현에 있다. 지금까지 인식하지 못했지만 앞서 보아온 모든 예제에서 String 클래스의 인스턴스를 생성해왔다. String 클래스의 인스턴스 생성 문자열 표현을 위한 String 인스턴스의 생성 방법은 다음과 같다. 일반적인 인스턴스 생성 방법과 차이가 없다. String str = new String("Simple String"); 이렇게 인스턴스가 생성되면, str이 참조하는 String 인스턴스의 내부에는 문자열 "Simple String"이 담기게 되고, 이는 다음과 같이 출력하여 그 내용을 확인할 수 있다. System.out.println(str); 지금까지 많이 호출해왔던 Sys..
[Java] 11.01 - 메소드 오버로딩(Method Overloading) 들어가며 한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 허용되지 않는다. 그러나 매개변수의 선언이 다르면 가능하다. 그리고 이것을 메소드 오버로딩이라 한다. 메소드 오버로딩의 조건 호출할 메소드를 찾을 때, 다음 두 가지 정보를 참조하여 메소드를 찾게 된다. 메소드의 이름 메소드의 매개변수 정보 예를 들어서 다음 메소드의 호출문을 보자. MyHome home = new MyHome(); home.mySimpleRoom(3, 5); 위의 문장에서 호출하는 메소드를 찿을 때 다음 두 가지 정보가 사용된다. 메소드의 이름이 mySimpleRoom이다. 3과 5를 인자로 전달받을 수 있는 메소드이다. 즉 위의 메소드 호출문이 찾는 메소드의 모양새는 다음과 같다. 반환형은 임의로 void로 선언하..
[Java] 10.04 - 또 다른 용도의 static 선언 들어가며 static 선언은 클래스 변수와 클래스 메소드의 선언 이외에 다른 용도로도 사용이 된다. 사용 빈도가 높지는 않으나 상황에 따라 유용하게 사용될 수 있으니 알아두는 것이 좋다. static 초기화 블록(Static Initialization Block) 다음 클래스 정의를 보자. 이 클래스에는 프로그램의 실행 날짜를 저장할 목적으로 변수가 하나 선언되어 있다. 그리고 이 변수는 변경의 대상이 이니고, 참조만을 목적으로 하므로, '클래스 변수'로 선언을 하였다. class DateOfExecution{ static String date; // 프로그램의 실행 날짜를 저장하기 위한 변수 public static void main(String[] args){ System.out.println(dat..
[Java] 10.03 - System.out.println() & public static void main() 들어가며 지금까지 main 메소드를 정의할 때 그 앞에 static 선언을 붙여왔다. 그리고 인스턴스의 생성 없이 println 메소드를 호출해 왔다. 어케했ㄴ노 System.out.println()에서 out과 println의 정체는? static 선언의 의미를 알았으니, System.out.println의 구성을 이해할 수 있다. 일단 System은 자바에서 제공하는 클래스로, java.lang 패키지에 묶여 있다. 따라서 원칙적으로는 다음과 같이 호출하는 것이 맞다. java.lang.System.out.println( . . . ); 그러나 컴파일러가 다음 문장을 삽입해주기 때문에 패키지의 이름 부분을 생략할 수 있다. import java.lang.*; // 컴파일러가 삽입하는 import 선언..
[Java] 10.02 - static 선언을 붙여서 선언하는 클래스 메소드 들어가며 클래스 내에 정의된 메소드에 static 선언을 하면 '클래스 메소드'가 된다. 그리고 클래스 메소드는 그 성격이 클래스 변수와 유사하다. 접근 방법도 동일하며, 인스턴스 생성 이전부터 호출이 가능한, 그리고 어느 인스턴스에도 속하지 않는 메소드라는 점도 클래스 변수와 유사하다. 클래스 메소드의(static 메소드의) 정의와 호출 앞서 공부한 클래스 변수의 특성 2가지는 다음과 같다. 인스턴스 생성 이전부터 접근이 가능하다. 어느 인스턴스에도 속하지 않는다. 이 두가지는 클래스 메소드도 동일하게 갖는 특성이다. 따라서 이 사실을 다음 예제를 통해서 확인해보겠다. 더불어 클래스 변수의 접근 방법과 동일한 '클래스 메소드의 호출 방법'도 확인해보자. class NumberPrint { private..
[Java] 10.01 - static 선언을 붙여서 선언하는 클래스 변수 들어가며 '인스턴스 변수'는 인스턴가 생성되었을 때, 생성된 인스턴스 안에 존재하는 변수이다. 그러나 '클래스 변수'는 인스턴스의 생성과 상관없이 존재하는 변수이다. 선언된 클래스의 모든 인스턴스가 공유하는 '클래스 변수(static 변수)' 클래스 내에 선언된 변수 앞에 static 선언을 붙이면 이는 인스턴스 변수가 아닌 '클래스 변수'가 된다. 이러한 클래스 변수의 특성을 파악하기 위해서 다음 예제를 관찰하자. 이 예제는 클래스 변수의 이해에 초점이 맞춰져 있어서 이 예제만으로도 클래스 변수의 기본 특성을 파악할 수 있을 것이다. class InstCnt{ static int instNum = 0; // 클래스 변수 (static 변수) InstCnt(){ // 생성자 instNum++; // st..
[Java] 09.03 - 캡슐화(Encapsulation) 들어가며 캡슐화는 정보 은닉과 더불어 객체지향 기반의 클래스 설꼐에 있어 가장 기본이면서 중요한 원칙 중 하나이다. 캡슐화는 문법적인 내용은 아니다. 클래스 안에 '무엇을 넣을까' 에 대한 이론을 제시하는 내용이다. 콘택 600과 캡슐화 코감기 약 중에서 대충 매우 유명한 약이 있었다. 아주 오래 전에 나온 약인데, 지금도 이름이 '콘택600'에서 '콘택골드'로 변경되어 판매되고 있다. 그리고 무엇보다 그 생김새가 다른 약들과는 확연히 구분된다. 모든 약들이 그러하지만 이 약은 갭슐화가 잘 이뤄진 예로 볼 수 있다. 이 약이 갖는 기능은 다음과 같다. 흐르는 '콧물'을 멎게 하는 기능 멈추지 않는 '재채기'를 가라앉혀 주는 기능 답답한 '코막힘' 상태를 완화시켜 주는 기능 그런데 만약에 이 약이 '콧물용..
[Java] 09.02 - 접근 수준 지시자(Access-level Modifiers) 들어가며 앞서 인스턴스 변수를 대상으로 private 선언을 하였는데 이러한 유형의 키워드를 가리켜 '접근 수준 지시자'라고 한다. (Access-level Modifiers) 이름 그래도 접근의 허용 수준을 결정할 때 선언하는 키워드이다. 4가지 종류의 '접근 수준 지시자' '접근 수준 지시자'의 종류는 다음과 같이 4가지이다. 참고로 '참근 수준 지시자'는 다양한 한글 표현이 존재하므로 영어 표현 'Access-level Modifiers'를 기억해 두는 것이 좋다. public, protected private, default 이 중에서 default는 키워드가 아닌, '아무런 선언도 하지 않은 상황'을 의미한다. 비록 이는 키워드가 아닌 일종의 '상황'이지만 이 역시 '접근 수준 지시자'의 한 종..
[Java] 09.01 - 정보 은닉(Information Hiding) 들어가며 자바에서 말하는 '정보'는 클래스의 '인스턴스 변수'를 의미한다. 따라서 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 것이다. 정보를 은닉해야 하는 이유 다음 예제를 시작으로 이야기를 전개하고자 한다. 다음 예제는 컴파일도 실행도 잘 된다. 다만 내용상 그리고 의미상 문제가 되는 부분이 있다. class Circle{ double rad = 0; // 원의 반지름 final double PI = 3.14; public Circle(double r){ setRad(r); // 아래에 정의된 setRad 메소드 호출을 통한 초기화 } public void setRad(double r){ if(r < 0){ // 반지름은 0보다 작을 수 없으므로 rad = 0; return; // 이 위치에서 메..
[Java] 08.02 - 패키지(Package)의 이해 들어가며 간단하게 설명하면, 패키지는 클래스를 묶는 수단이다. 묶어서 '다른 클래스' 또는 '다른 클래스들의 묶음'을 구분하기 위한 수단이다. 패키지 선언의 의미와 목적 자바 8을 기준으로 Java SE에서 제공하는 클래스의 수만 해도 300개가 넘는다. 단, 이름이 A로 시작하는 클래스의 수만 세었을 때, 그 정도이다. 따라서 이름이 Z로 시작하는 클래스까지 그 수가 수천을 넘는다는 것을 쉽게 짐작할 수 있다. 그런데 이들이 단순히 이름만 갖는다면 어떠한 용도로 사용되는 클래스인지 구분이 어려워진다. 예를 들어서 다음의 클래스가 무엇과 관련이 있는지 알 수 있는가? Class CookieManager 클래스의 이름만 놓고 보면 짐작이 가지 않는다. 그런데 위의 클래스가 속한 다음 패키지의 이름을 보면 ..
[Java] 08.01 - 패키지와 클래스 패스 들어가며 '패스(Path)'라는 단어는 경로를 의미한다. 그리고 자바에서 '클래스 패스'가 의미하는 바는 다음과 같다. 자바 가상 머신이 클래스 파일을 찾는 경로 즉 자바 가상 머신은 프로그램의 실행 과정에서 클래스 파일을 찾을 때, 이 '클래스 패스'라는 것을 기준으로 찾는다. 물론 클래스 패스를 지정하는 것은 프로그래머의 몫이다. 현재 디렉토리(Current Directory)를 기준으로 한 실행 다음 예제를 컴파일하고 실행하자. 단 실행 환경을 일치시키기 위해서 소스파일을 다음 위치에 가져다 놓고 컴파일 및 실행을 하자. C:\PackageStudy class AAA{ public void showName(){ System.out.println("My name is AAA"); } } class Z..