자바 언어가 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) 만에, 즉 단번에 그 값에 접근이 가능하다. 예를 든다면 학번으로 학생 객체를 찾거나 주민번호로 사용자 객체를 찾거나 우편번호로 주소를 찾는 등 우리는 사실 실생활에서도 키를 이용해 값을 찾는 사례를 많이 가지고 있다. 파이썬이 해시맵을 딕셔너리(사전)이라고 부르는 이유도..
배열과 ArrayList 차이 자바에서 배열은 C 언어와 마찬가지로 동일한 타입의 값을 연속하여 정해진 크기만큼 저장하는 자료구조다. 대신 C 언어와의 차이라면 자바 배열은 배열의 참조 선언과 실제 배열의 할당이 분리되어야 하며, 배열은 반드시 new를 통해 할당되어야 한다는 점이다. int nArray[] = new int[20]; String strArray[] = null; ... strArray = new String[maxStringCnt]; 배열의 문제점은 new로 할당된 크기를 벗어나서 배열에 값을 넣거나 접근하면 ArrayIndexOutOfBoundsException라는 예외가 나게 된다는 점이다. 즉 배열은 필요한 크기만큼 동적할당하는데, 한번 할당하면 그 크기를 넘어가게 사용할 수 없다..
이번 포스트에서는 객체의 클론과 깊은 복사, 얕은 복사에 대해 살펴본다. 클론은 같은 객체를 값을 복사하여 그대로 한 개 더 만드는 것이다. ArrayList 같은 객체는 두 변수가 같은 객체를 참조하는 경우(매개변수로 전달한 경우) 한 변수를 통해 객체 내부의 값을 바꾸면 다른 변수의 객체(같은 것이므로)도 바뀌게 된다. 이런 경우 우리는 바꾸기 이전 값을 저장하기 위해 클론을 통해 같은 객체를 한 개 더 만들어두는 경우가 많이 있다. 먼저 클론(clone)이 무엇인지 알아보자. 클론은 필드의 값이 같은 새로운 객체를 만드는 것이다. 그러면 객체가 하나 더 생기고 모든 필드가 원래 객체와 같은 값을 가지게 될 것이다. 이 때 값변수라면 값을 저장할 새로운 메모리가 객체 안에 생기고 새로운 객체에는 새로..
스트링 클래스를 얘기할 때 흔히 불변성에 대해 언급한 것을 많이 본다. Immutable을 불변성으로 번역하는데, 이것이 무엇을 의미하는지 이해하기가 쉽지는 않다. 간단하게 말해서 스트링 객체는 한번 만들어지면 그 안에 포함된 문자열의 값이 바뀌지 않는다. 생성될 때 정해진 문자열 데이터가 변할 수 없다는 뜻이다. 대표적인 예로 i번째 글자를 가져오는 charAt(i)라는 메소드는 있지만 i번째 글자를 수정할 수 있는 방법은 없다. 스트링에 들어있는 데이터를 일부라도 바꿀 수 있는 방법이 없다는 것이다. 그렇다면 + 연산이나 substring 메소드는 무엇인가? 일부를 바꾸는 replace 메소드는? 이런 메소드들은 스트링의 값을 변경시키는 것이 아니라 원래 객체는 그대로 두고 새로운 객체를 만들어서 돌..
프로그램을 좀 해본 사람이라면 System.out.printf를 많이 써 봤을 것이다. 자바의 printf는 C 언어의 printf에 뿌리를 두고 있어 프로그래머들에게 익숙한 개념이다. printf는 특히 숫자를 길이나 형식에 맞게 출력하는데 유용하다. 그런데 잘 모르고 있는 사람이 많지만 System.out.format이라는 메소드도 printf와 똑같은 기능을 제공한다. 그런데 자바에서는 이러한 포매팅의 개념이 스트링에서 출발하고 있다. String.format() 메소드가 System.out.printf나 System.out.format에서 사용되는 것과 같다. 그럼 이 format 메소드에 대해 좀더 자세히 알아보자. String.format(포매팅문자열, 인수, ...); 여기서 인수는 포매팅 ..
- Total
- Today
- Yesterday
- contains
- Camel Style
- APPEND
- 패턴
- rust
- python exercise
- zip
- comparable
- contentEquals
- format
- 스트링
- TypeError
- Lazy evaluation
- 이터레이터
- 동적바인딩
- python example
- max
- 지연계산
- CompareTo
- ToString
- indexof
- 콜렉션
- C++ 클래스
- 스트링 +
- 자바regex
- typedef
- sort key
- follow
- Iterator
- 이터러블
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |