본문 바로가기

Java

(47)
[Java] 15.03 - instanceof 연산자 들어가며 끝으로 유용하게 사용할 수 있는 상속과 관련된 연산자 하나를 소개하고자 한다. 이 연산자의 피연산자는 참조변수와 클래스의 이름이다. instanceof 연산자의 기본 연산자 instanceof는 참조변수가 참조하는 인스턴스의 '클래스'나 참조하는 인스턴스가 '상속하는 클래스'를 묻는 연산자이다. 예를 들면 다음과 같이 문장을 구성할 수 있다. if (ca instanceof Cake) .... 위에서 ca는 참조변수이고 Cake는 클래스 이름이다. 그리고 ca가 참조하는 인스턴스가 Cake의 인스턴스이거나 Cake를 상속하는 클래스의 인스턴스이면 true를, 그렇지 않다면 false를 반환한다. 관련하여 다음 예제를 보자. class Cake {} class CheeseCake extends C..
[Java] 15.02 - 메소드 오버라이딩 들어가며 메소드 오버라이딩은 상위 클래스에 정의된 메소드를 하위 클래스에서 다시 정의하는 것을 뜻한다. 이렇듯 메소드 오버라이딩이 문법적으로는 단순하지만 이것이 가져다주는 이점은 결코 가볍지 않다. 상위 클래스의 참조변수가 참조할 수 있는 대상의 범위 앞서 다음과 같이 SmartPhone 클래스가 MobilePhone 클래스를 상속하는 형태로 클래스를 디자인한 바 있다. class SmartPhone extends MobilePhone {....} 따라서 다음과 같이 문장을 구성할 수 있다. SmartPhone phone = new SmartPhone("010-3333-6666", "Nougat"); 그런데 다음과 같이 MobilePhone형 참조변수가 SmartPhone 인스턴스를 참조할 수도 있다. ..
[Java] 15.01 - 상속을 위한 두 클래스의 관계 들어가며 두 클래스를 상속의 관계로 맺는 것이 도움이 되는 상황이 있고 도움이 되지 않는 상황이 있다. 그렇다면 언제 두 클래스를 상속의 관계로 맺어야 하는가? 기본적으로 'IS-A 관계'라는 것이 성립해야 상속의 후보로 고려할 수 있다. 상속의 기본 조건인 'IS-A 관계' 상속이 갖는 문법적 특성을 통해서 상위 클래스와 하위 클래스를 다음과 같이 이야기 할 수 있다. "하위 클래스는 상위 클래스의 모든 특성을 지닌다." "거기에 더하여 하위클래스는 자신만의 추가적인 특성을 더하게 된다." 이러한 '상속'의 특성을 현실 세계에서도 찾아볼 수 있다. 대표적인 예가 다음과 같다. 아래에서 모바일폰은 통화의 기능만 담겨있는 feature phone을 의미한다. 모바일폰 vs 스마트폰 '모바일폰'이 상위 클래..
[Java] 14.02 - 클래스 변수, 클래스 메소드와 상속 들어가며 static 선언이 붙는 크래스 변수와 클래스 메소드도 상속의 대상에 포함이 되겠는가? static 선언이 갖는 의미를 떠올리고 논리적으로 접근하면 이 질문에 스스로 답을 할 수 있다. static 선언이 붙는 '클래스 변수'와 '클래스 메소드'의 상속 앞서 공부한 클래스 변수와 클래스 메소드의 특징을 정리하면 다음과 같다. 인스턴스의 생성과 상관없이 접근이 가능하다. 클래스 내부와 외부에서(접근 수준 지시자가 허용하면) 접근이 가능하다. 클래스 변수와 클래스 메소드가 위치한 클래스 내에서는 직접 접근이 가능하다. 즉 클래스 변수와 클래스 메소드는 인스턴스에 속하지 않는, 딱 하나만 존재하는 변수와 메소드이다. 따라서 상속의 대상이 아니다. 예를 들어서 다음 클래스를 보자. class Super..
[Java] 14.01 - 상속의 기본 문법 이해 들어가며 상속의 적절한 활용 방법은 한두 문장으로 가볍게 설명할 수 있는 내용이 아니다. 그리고 이에 대한 설명을 듣기에 앞서, 상속에 대한 문법적이 이해가 선행되어야 한다. 상속에 대한 매우 치명적인 오해 상속의 이유와 목적을 물어보면 다음과 같이 답을 하는 경우를 매우 흔하게 본다. "상속은 코드의 재활용을 위한 문법이다." 그러나 객체지향 기반의 개발 경험이 풍부한 개발자나, 대학원엣서 컴퓨터공학을 전공한 이들에게 질문을 하면 다음의 내용으로 답을 한다. "연관된 일련의 클래스들에 대해 공통적인 규약을 정의할 수 있다." 위의 답변은 매우 모범적인 답변이긴 하지만 지금 이해할 수 있는 내용은 아니다. 그러나 이 문장의 이해를 목표로 상속을 공부해야 하며, Chapter 16까지 공부하는 과정에서 이..
[Java] 13.03 - 다차원 배열의 이해와 활용 들어가며 배열의 논리적 메모리 구조가 2차원 이상의 형태를 보이는 배열을 가리켜 '다차원 배열'이라고 한다. 즉 2차원배열도 다차원 배열이고, 3차원 배열도 다차원 배열이다. 그러나 일반적인 프로그램에서는 2차원을 초과하는 구조의 배열을 잘 이용하지 않는다. 따라서 설명의 초점을 2차원 배열에 두고자 한다. 그러나 2차원배열을 잘 알면 3차원 배열도 다룰 수 있다. 2차원 배열의 생성과 접근 1차원 배열은 그 이름이 의미하듯이 둘 이상의 변수가 '선의 형태'로 존재하는 배열이다. 반면 2차원 배열은 다수의 변수가 '면의 형태'로 존재하는 배열이다. 위 그림에서 보이듯이 세로 길이와 가로 길이가 각각 3과 4인 int형 2차원 배열은 다음과 같이 생성 한다. int[][] arr = new int[3][4..
[Java] 13.02 - enhanced for문 들어가며 이번에 소개하는 enhanced for문은 자바 5에서 추가되었다. 그리고 지금은 많이 사용되는 반복문 중 하나가 되었다. enhanced for문의 이해와 활용 프로그램을 작성하다 보면 다음과 같이 배열에 저장된 모든 요소를 대상으로 연산, 참조, 또는 탐색을 진행하는 경우를 흔히 접할 수 있다. 배열에 저장된 값 중에서 특정 조건에 해당하는 값을 찾아라. 배열에 저장된 모든 값에 대해 12%씩 그 값을 증가시켜라. 그리고 이러한 상황에서의 문장 구성을 돕기 위해 등장한 것이 enhanced for문이다. 이는 for-each문으로도 불린다. 예를 들어서 '배열에 저장된 모든 값을 출력하라'는 요구 사항을 만족하는 for문은 다음과 같이 작성할 수 있다. int[] ar = {1, 2, 3, ..
[Java] 13.01 - 1차원 배열의 이해와 활용(2) 참조변수 선언의 두 가지 방법 다음의 참조변수 선언을 보자. 이는 앞서 소개하고 설명한 방식의 참조변수 선언이다. int[] arr; 동일한 참조변수 arr을 다음과 같이 선언할 수도 있다. int arr[]; 다음과 같이 배열을 생성하는 문장에서도 이 둘은 동일한 의미로 사용된다. int[] arr = new int[3]; // 조금 더 선호하는 방법 int arr[] = new int[3]; 배열의 참조 값과 메소드 배열도 인스턴스이므로 메소드 호출 시 참조 값의 전달이 가능하다. 예를 들어서 다음과 같이 배열의 참조 값을 인자로 전달할 수 있다. public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7}; int sum = ..
[Java] 13.01 - 1차원 배열의 이해와 활용(1) 들어가며 배열은 '자료형이 같은 둘 이상의 값'을 저장할 수 있는 메모리 공간을 의미한다. 그리고 배열은 그 구조에 따라서 '1차원 배열'과 '다차원 배열'로 나뉜다. 1차원 배열의 생성 방법 1차원 배열은 다음과 같이 정의할 수 있다. 타입이 같은 둘 이상의 데이터를 저장할 수 있는 1차원 구조의 메모리 공간 그런데 자바는 배열도 인스턴스로 처리한다. 즉 '자바 에서는 배열도 인스턴스'이다. 그럼 다음 문장을 모자. 이는 5개의 int형 값을 저장할 수 있는 1차원 배열의 생성문이다. int[] ref = new int[5]; 위의 문장에서 등호를 기준으로 왼편, 오른편에 위치한 것은 각각 '참조변수의 선언'과 '배열의 생성'이다. int[] ref // int형 1차원 배열 인스턴스를 참조할 수 있는..
[Java] 12.02 - 콘솔 입력(Console Input) 들어가며 Scanner 클래스는 자바 5에서 소개되었다. 그리고 이 클래스로 인해 키보드의 입력을 읽어 들이는 코드를 쉽게 구성할 수 있게 되었다. 그 이전에는 이러한 일을 하는 코드의 구성이 간단하지 않았다. Scanner 클래스 키보드의 입력을 처리하는 코드에 상관없이, Scanner 클래스 자체를 이해할 필요가 있다. 이 클래스가 속한 패키지는 java.util이다. 그리고 이 클래스에 정의된 생성자 중 일부는 다음과 같다. 실제로는 더 많은 생성자가 정의되어 있으나 필요할 때마다 하나씩 알아가면 된다. Scanner(File source) Scanner(String source) Scanner(InputStream source) Scanner 클래스는 생성자로 전달되는 대상으로부터 데이터를 추출하..
[Java] 12.01 - 콘솔 출력(Console Output) 들어가며 콘솔은 컴퓨터를 대상으로 데이터를 입력 및 출력하는 장치를 총칭하는 단어다. 따라서 키보드와 모니터도 콘솔 입출력 장치에 해당한다. System.out.println & System.out.print 자바의 대표적인 콘솔 출력 메소드는 System.out.println이다. 이 메소드는 문자열을 출력하고 나서 행을 바꾸는 특징이 있다. 반면 문자열 출력 후에 행을 바꾸지 않는 System.out.print 메소드도 존재한다. 이 두 메소드는 사용하기도 쉽고 예제를 통해서 호출해 본 경험도 있다. 따라서 출력 방법에 대한 설명은 생략하고, 대신에 지금까지 소개하지 않은 이 두 메소드의 특징을 소개하고자 한다. 이와 관련하여 다음 예제를 보자. class Box{ private String cont..
[Java] 11.03 - String 클래스의 메소드(2) concat 메소드는 이어서 호출이 가능하다. concat 메소드는 다음의 형태로 호출이 가능하다. 그리고 이 문장을 통해서 참조변수 str은 3개의 문자열을 연결해서 만든 "ABCDEFG"를 참조하게 된다. String str = "AB".concat("CD").concat("EF"); String str = "ABCDEF"; // 두 문장은 동일한 결과를 출력한다. 위의 문장에서 concat 메소드의 호출이 이어져 있다는 점이 특이하다. 이러한 형태로 concat 메소드의 호출이 가능한 이유는 무엇인가? 이에 대한 이해를 돕기 위해 위 문장에 소괄호를 추가하면 다음과 같다. String str = ("AB".concat("CD")).concat("EF"); 즉 위의 문장에서 왼편에 위치한 concat..