자바의 인터페이스가 무엇인지 이해하기가 쉽진 않다. 학생들 중에는 자바의 인터페이스를 메소드 선언부만 가지는 클래스? 또는 다중상속이 가능하게 해주는 것, 정적 필드만 가지는 클래스 등 단편적인 사실로 알고 있는 경우가 많다. 사실 자바에서 인터페이스란 다중 상속보다 훨씬 더 광범위하고 중요한 개념이다. 클래스가 실제 세계의 객체를 나타낸다면 인터페이스는 성질, 기능 또는 역할을 모델링한다. 데이터는 고려하지 않고 기능(하는 일)만 모델링하는 것인데, 예를 들면 어떤 물건이 판매되기 위해 필요한 기능은 가격을 물어보고 판매하고 상태를 물어보는 등의 기능이 필요하다. 가격이나 상태 등의 데이터를 가져야 할 것 같지만, 데이터를 생각하지 않고 기능만 생각하는 것이 인터페이스다. 실세계에서 회사의 업무처리를 ..
상속과 가상함수에 대해 얘기하기 위해서는 클래스가 무엇인지 알아야 한다. 클래스는 데이터 필드와 그에 대한 메소드를 정의하는 것이다. 예를 들어 사람 클래스라면 이름, 나이, 성별, 주소를 가진다. 그리고 그 메소드로 자기소개를 하거나(intro) 집에 가거나(goHome) 나이를 한 살 더 먹는다(getOlder). 즉 메소드란 그 사람의 데이터로 무슨 일을 하거나 필드의 값을 바꾸는 것이다. 예를 들어 intro는 그 사람의 이름과 나이를 소개하고, goHome()은 그 사람의 주소로 가는 것이다. 클래스 객체란 클래스의 데이터 모음을 얘기하는데, 메모리에 그 데이터를 저장할 메모리가 생기면 객체가 생겼다고 한다. 사람이 열명이면 이름, 나이, 성별도 열 개가 필요하다. 즉 객체가 열개가 생겨야 하는..
Integer나 Double 클래스가 가끔 코드에 등장한다. 이들은 기본 타입인 int나 double에 대응하는 래핑(wrapping) 클래스 타입이다. 이런 타입을 많이 접하는 것이 ArrayList와 같이 콜렉션 객체를 선언할 때이다. 이 클래스들이 왜 필요할까? 앞의 포스트에서 값 변수와 참조 변수에 대해 살펴보았다. 자바에서 변수는 값 모델(즉 변수가 직접 값을 가지는 형태)과 참조 모델(변수는 객체의 참조를 가짐. 객체는 힙 메모리의 어딘가에 존재한다)로 나눈다. int와 double은 기본타입으로 값모델을 가지는데, 그 경우 int n;이라고 선언하면 n이 나타내는 주소(위치)에 int 값이 저장된다. 이 때 n은 값을 나타내기도 하고 저장소를 나타내기도 한다. 이것을 값모델이라고 한다. 반면..
자바에서는 메소드 내에서 자신의 필드나 메소드를 접근할 때 별도의 객체. 을 붙이지 않고 바로 이름을 쓴다. 이클립스 같은 개발환경에서는 this. 이라고 하면 이 객체가 가진 필드와 메소드를 툴팁으로 보여주고 자동완성해 주기도 한다. 그러나 this 를 붙이지 않고 쓰면 어떤 이름에 해당하는지를 다음과 같은 규칙으로 결정한다.그 이름이 사용된 위치에서 속한 메소드의 지역변수나 매개변수에 해당 이름이 있으면 그것으로 본다.없으면 this의 필드에서 찾는다. 이 때 static 필드와 일반 필드에서 모두 찾는다.그래도 없으면 undefined identifier라는 컴파일 오류가 발생한다.여기서 첫번째 this의 용법이 나온다. 즉 지역변수의 이름이 필드의 이름(예를 들어 name이라고 하자)과 같은 경우..
자바 언어가 C와 다른 가장 큰 특징이 무엇일까? 여러 가지가 있겠지만 필자는 모든 클래스가 Object를 상속한다는 점을 들겠다. 다른 말로 Object가 모든 클래스의 슈퍼클래스다. 놀라운 일이지만 모든 객체는 Object가 될 수 있다. 좀더 정확히 말하면 Object 타입의 변수에 의해 참조될 수 있다. 스트링이나 새로 만든 학생 객체나 심지어는 int 값도 Object 타입의 변수 obj에 들어갈 수 있다. Object obj = null; obj = "abcde"; obj = 3; obj = new Student(); 이것이 어떻게 가능할까? 자바에서 모든 것은 객체고 객체는 모두 Object 클래스를 상속한 어떤 클래스의 인스턴스다. 그러므로 모든 객체는 Object 타입의 변수에 들어갈 수..
소프트웨어 프로그램에는 프로그램의 시작과 끝을 책임지는 main 함수가 있다. 객체지향 프로그램에서도 프로그램은 하나의 클래스 객체(메인 클래스)에 의해 실행이 시작된다(이런 것을 driver 클래스라고도 한다). 또한 프로그램이 가져야 할 자료구조 전체를 관리하는 책임을 지는 클래스도 있다. 메인 클래스와 driver 클래스와 전체를 관장하는 클래스가 같을 때도 있고 다를 때도 있다. 그런데 흔히 이러한 클래스의 객체는 하나만 존재해야 한다. 여러 번 new 해서 객체가 만들어지면 안된다. 이런 클래스를 싱글톤 클래스라고 한다. 싱글톤 클래스는 객체가 하나만 존재해야 하는 클래스로 이것을 보장하는 방법으로 싱글톤 패턴이라는 것이 있다. 패턴이란 프로그래밍에서 흔히 발생하는 문제를 구현하는 표준적인 방법..
자바에서 변수는 객체 타입을 가지는 경우 객체에 대한 참조를 가진다. 객체의 필드의 경우에도 마찬가지여서 필드가 다른 객체 타입을 가질 때는 객체 안에 그 참조를 가지는 메모리가 잡힌다. 즉 그 객체 안에는 참조만 들어있고 참조가 다른 곳에 있는 객체를 가리킨다. 이러한 객체들은 모두 new 되어 힙메모리 어딘가에 자리잡고 있을 것이다. 다음 그림은 학생 클래스의 객체 예를 보여준다. 학생이 학번, 이름, 학년, 학과, 점수배열을 가지고 있다고 해 보자. 여기서 int 타입의 학번과 학년은 객체 안에 해당 필드가 값을 가진다. (값 필드) 그러나 String이나 배열 타입의 객체 필드는 참조만 가진다. 이 참조는 어딘가에 있는 스트링 객체나 배열 객체를 가리킬 것이다. 처음에 객체가 new로 생성되었을 ..
생성자란 메소드라기 보다는 객체의 생성과 초기화를 담당하는 특별한 기능이라고 볼 수 있다. 사실 생성자가 필요한 이유는 프로그램에서 변수를 초기화하는 것의 중요성에서 출발한다. 초기화되지 않은 필드는 프로그램이 오류를 일으키는 가장 중요한 원인 중 하나이다. 또한 그 오류는 테스트를 통해 검출되지 않는 오류로 유명하다. 그래서 객체지향프로그래밍에서는 생성자라고 하는 특별한 방법을 이용하여 객체를 만들고 나서 값을 반드시 초기화하도록 언어를 설계했다. 생성자는 메소드와 비슷하게 생겼지만 이름이 클래스 이름과 같고 반환형이 없다. 예를 들어 다음의 학생 클래스 생성자는 매개변수로 받은 값으로 필드를 초기화하고 있다. public Student(int id, String n, int y) { this.id =..
다음은 입력받은 학생을 고유번호에 따라 팀을 나누는 프로그램이다. 단 여기서 이름이 같은 사람이 나오면 두번째 부터는 차례로 (1), (2), 순서로 번호를 이름 뒤에 붙여준다. 왼쪽의 입력에 대해 오른쪽과 같은 출력이 나오게 프로그램을 작성해 보자. 이름은 같은 이름이 나오면 구분되게 차례로 증가하는 번호를 뒤에 붙여주고, 팀은 학생의 번호로 해당 학생을 찾는다. 1 lee 3 m 2 kim 4 m 3 cho 3 f 4 park 2 m 5 kang 3 f 6 lee 2 f 7 kim 3 m 8 song 3 f 9 choi 2 m 10 cho 2 f 0 A 1 2 3 4 0 B 3 5 7 0 C 2 4 0 D 7 8 9 10 0 end 1 lee 3학년 남 2 kim 4학년 남 3 cho 3학년 녀 4 ..
해시맵은 맵(C++)이라고도 하고 사전(파이썬)이라고도 불리는 자료구조로 프로그램에서 매우 중요하고 가장 널리 쓰이는 자료구조다. 키를 이용하여 키(key)에 따라 값(value)을 인덱싱하는 목적이다. 검색하거나 키로 값을 접근해야 되는 일이 자주 발생하는 경우 거의 해시맵을 통해 이를 인덱싱해 둔다. 그러면 값을 넣을 때는 해싱을 하고 인덱싱을 해두어야 하므로 계산시간이나 메모리가 약간 더 소요되지만 키로 값을 접근할 때는 O(1) 만에, 즉 단번에 그 값에 접근이 가능하다. 예를 든다면 학번으로 학생 객체를 찾거나 주민번호로 사용자 객체를 찾거나 우편번호로 주소를 찾는 등 우리는 사실 실생활에서도 키를 이용해 값을 찾는 사례를 많이 가지고 있다. 파이썬이 해시맵을 딕셔너리(사전)이라고 부르는 이유도..
- Total
- Today
- Yesterday
- Lazy evaluation
- 패턴
- CompareTo
- 콜렉션
- APPEND
- sort key
- C++ 클래스
- 이터러블
- follow
- 동적바인딩
- indexof
- ToString
- zip
- 스트링 +
- max
- 스트링
- Camel Style
- typedef
- contentEquals
- contains
- python exercise
- comparable
- Iterator
- 지연계산
- python example
- TypeError
- 자바regex
- 이터레이터
- format
- rust
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |