'java'에 해당되는 글 5건
- 2008/03/26 [Java] Head first java (5)
- 2008/03/26 [Java] Head first java (4)
- 2008/03/25 [Java] Head first java (3)
- 2008/03/25 [Java] Head first java (2)
- 2008/03/20 [Java] Head first java (1) (2)
두 수중 더 작은 값을 리턴해주는 min(int a, int b);
더 큰 값을 리턴해 주는 max(int a, int b);
이런 메소드는 인스턴스 변수(클래스 내의 property)를 전혀 사용하지 않아도 된다.
즉, 인스턴수 변수에 따라 행동이 달라지지 않기 때문에 인스턴스 객체가 필요하지 않다.
클래스(틀)만 있어도 된다.
=> static 클래스.
더 큰 값을 리턴해 주는 max(int a, int b);
이런 메소드는 인스턴스 변수(클래스 내의 property)를 전혀 사용하지 않아도 된다.
즉, 인스턴수 변수에 따라 행동이 달라지지 않기 때문에 인스턴스 객체가 필요하지 않다.
클래스(틀)만 있어도 된다.
=> static 클래스.
static메소드를 호출할 때는 클래스 명을 사용한다.
Math.min(1,8); // Math는 클래스 이름.
Math.min(1,8); // Math는 클래스 이름.
정적(static) 메소드는 그 정적 메소드가 들어있는 클래스의 특정 인스턴스와는 전혀 무관하게 실행됩니다.
정적(static) 메소드에서는 정적 변수가 아닌 변수(인스턴스변수)를 쓸 수 없습니다.
정적(static) 메소드에서는 정적 변수가 아닌 변수(인스턴스변수)를 쓸 수 없습니다.
정적 메소드에서는 정적 메소드가 아닌 메소드도 사용할 수 없습니다.
정적 변수는 모든 인스턴스(객체)들이 그 값을 공유하게 됩니다.
public class AA {
public staic int cnt = 5;
}
AA a = new AA();
AA b = new AA();
// 여기서 a.cnt 와 b.cnt는 같은 메모리 공간의 값을 나타내고 있는 것이다. 즉, 같은 변수이다.
정적 변수는 모든 인스턴스(객체)들이 그 값을 공유하게 됩니다.
public class AA {
public staic int cnt = 5;
}
AA a = new AA();
AA b = new AA();
// 여기서 a.cnt 와 b.cnt는 같은 메모리 공간의 값을 나타내고 있는 것이다. 즉, 같은 변수이다.
정적변수는 그 클래스에 속하는 객체가 생성되기 전에 초기화된다.
정적 변수는 그 클래스에 속하는 정적 메소드가 실행되기 전에 초기화 된다.
정적 변수는 그 클래스에 속하는 정적 메소드가 실행되기 전에 초기화 된다.
변수를 final로 지정하면 그 값을 바꿀수 없다.
메소드를 final로 지정하면 그 메소드를 오버라이드 할 수 없다.
클래스를 final로 지정하면 그 클래스를 확장할 수 없다. (상속불가능)
메소드를 final로 지정하면 그 메소드를 오버라이드 할 수 없다.
클래스를 final로 지정하면 그 클래스를 확장할 수 없다. (상속불가능)
클래스가 이미 final로 지정되어 있다면 메소드를 굳이 final로 지정하지 않아도 된다.
클래스를 상속받을 수 없기 때문에 오버라이드도 불가능하기 때문이다.
클래스를 상속받을 수 없기 때문에 오버라이드도 불가능하기 때문이다.
p.321까지
'Language > Java' 카테고리의 다른 글
| Java에서 다중상속이 없는 이유는?? (0) | 2008/07/29 |
|---|---|
| [SAX] String => xml 데이터로 파싱하기 (0) | 2008/03/31 |
| [Java] Head first java (5) (0) | 2008/03/26 |
| [Java] Head first java (4) (0) | 2008/03/26 |
| [Java] Head first java (3) (0) | 2008/03/25 |
| [Java] Head first java (2) (0) | 2008/03/25 |
오버로드된 메소드에서 그 상위 클래스 메소드를 호출하고자 할때는 super를 이용한다.
스택 : 메소드 호출과 지역변수가 저장된다.
힙 : 모든 객체가 저장되어 있는 곳이다. (가비지 컬렉션이 일어나는 곳이다.)
인스턴스 변수(메소드 안이 아닌 클래스 내에 선언되어 있는 변수)는 겍체내에 있는 것이니 당연히
힙에 저장되어 있다.
스택 (LIFO : 나중에 들어간게 먼저 나온다.)
public void aa() {
int a = 4;
}
Stack....
-------------------------
}
-------------------------
int a = 4;
-------------------------
aa() {
-------------------------
내 기억으론 닫는 괄호 } 가 나오면 스택에서 제거되었던걸로 기억한다.
힙 : 모든 객체가 저장되어 있는 곳이다. (가비지 컬렉션이 일어나는 곳이다.)
인스턴스 변수(메소드 안이 아닌 클래스 내에 선언되어 있는 변수)는 겍체내에 있는 것이니 당연히
힙에 저장되어 있다.
스택 (LIFO : 나중에 들어간게 먼저 나온다.)
public void aa() {
int a = 4;
}
Stack....
-------------------------
}
-------------------------
int a = 4;
-------------------------
aa() {
-------------------------
내 기억으론 닫는 괄호 } 가 나오면 스택에서 제거되었던걸로 기억한다.
컴파일러는 생성자가 전혀 없는 경우에만 기본생성자 A()를 만들어 준다. A(int a)같은 기본생성자 이외의
생성자가 있다면 기본생성자를 직접 만들어 주어야 한다.
생성자가 있다면 기본생성자를 직접 만들어 주어야 한다.
생성자가 실행되면 바로 그 상위클래스 생성자를 호출하고, Object클래스의 생성자에 다다를때까지
상속의 사슬을 거슬러 올라가면서 각 상위클래스의 생성자를 호출하게 됩니다.
우리가 직접 super()를 호출해주지 않으면 컴파일러가 알아서 super()를 호출해 주게 된다.
즉, 모든 생성자에 super()를 자동으로 추가해준다.
여기서 순서도 중요하다.
public Boop() {
size = 1;
super(); // <- 이건 잘못된 경우. super()는 맨 위에 있어야 한다.
}
상속의 사슬을 거슬러 올라가면서 각 상위클래스의 생성자를 호출하게 됩니다.
우리가 직접 super()를 호출해주지 않으면 컴파일러가 알아서 super()를 호출해 주게 된다.
즉, 모든 생성자에 super()를 자동으로 추가해준다.
여기서 순서도 중요하다.
public Boop() {
size = 1;
super(); // <- 이건 잘못된 경우. super()는 맨 위에 있어야 한다.
}
같은 클래스에 있는 다른 생성자를 호출할 때는 this()를 사용하면 된다.
레퍼런스 변수에 null을 넣으면 가비지 컬렉션 대상이 된다.
AAA aa = new AAA();
aa = null; <- 가비지 컬렉션 대상.
AAA aa = new AAA();
aa = null; <- 가비지 컬렉션 대상.
'Language > Java' 카테고리의 다른 글
| [SAX] String => xml 데이터로 파싱하기 (0) | 2008/03/31 |
|---|---|
| [Java] Head first java (5) (0) | 2008/03/26 |
| [Java] Head first java (4) (0) | 2008/03/26 |
| [Java] Head first java (3) (0) | 2008/03/25 |
| [Java] Head first java (2) (0) | 2008/03/25 |
| [Java] Head first java (1) (2) | 2008/03/20 |
A클래스가 B클래스를 상속받았고 B.aa()메소드를 오버라이드 했다.
a.aa();를 호출하면 가장 아래에 구현되어 있는 A클래스에 구현되어 있는 aa()가 호출된다.
즉, C가 B를 상속하고 B는 A를 상속받아 구현하고 있다. ( A < B < C )
만약 C는 aa()를 오버라이드 해서 구현하지 않고 있는 상황이다. B는 A의 aa()를 오버라이드 해서
구현되어 있다. c.aa()를 호출하면 B클래스에 구현되어 있는 aa()가 호출된다.
a.aa();를 호출하면 가장 아래에 구현되어 있는 A클래스에 구현되어 있는 aa()가 호출된다.
즉, C가 B를 상속하고 B는 A를 상속받아 구현하고 있다. ( A < B < C )
만약 C는 aa()를 오버라이드 해서 구현하지 않고 있는 상황이다. B는 A의 aa()를 오버라이드 해서
구현되어 있다. c.aa()를 호출하면 B클래스에 구현되어 있는 aa()가 호출된다.
Animal[] animals = new Animal[5];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Wolf();
animals[3] = new Hippo();
animals[4] = new Lion();
for(int i = 0 ; i < animals.length ; i++) {
animals[i].eat();
animals[i].roam();
}
// Dog, Cat, Wolf, Hippo, Lion클래스는 Animal을 상속받아 구현하고 있다.
// eat(), roam()이 구현되어 있다는 약속이 되어 있는 상황이기 떄문에 가능.
// 즉, 상속이란 일종의 규약이라 할 수 있다.
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Wolf();
animals[3] = new Hippo();
animals[4] = new Lion();
for(int i = 0 ; i < animals.length ; i++) {
animals[i].eat();
animals[i].roam();
}
// Dog, Cat, Wolf, Hippo, Lion클래스는 Animal을 상속받아 구현하고 있다.
// eat(), roam()이 구현되어 있다는 약속이 되어 있는 상황이기 떄문에 가능.
// 즉, 상속이란 일종의 규약이라 할 수 있다.
public 메소드를 private로 오버라이드 할 수 없다.
오버로딩이란 이름이 같고 인자목록이 다른 메소드 두개를 만드는 것. 오버로드된 메소드는 다형성과는
전혀 관계가 없음.
전혀 관계가 없음.
abstract로 클래스를 지정하면 컴파일러는 그 유형의 인스턴스를 만드는 코드를 허용하지 않는다.
추상클래스는 확장하지 않으면 거의 쓸모도 없고, 가치도 없고, 삶의 목적도 없다.
추상클래스 <-> 구상클래스
추상클래스 <-> 구상클래스
추상클래스는 반드시 확장해야 하는 클래스.
추상메소드는 반드시 오버라이드해야 하는 메소드.
public abstract void eat(); // 추상메소드 (본체가 없다)
추상메소드를 만들때는 클래스도 반드시 추상이여야 한다.
추상메소드는 반드시 오버라이드해야 하는 메소드.
public abstract void eat(); // 추상메소드 (본체가 없다)
추상메소드를 만들때는 클래스도 반드시 추상이여야 한다.
Object클래스
- booean equals();
- Class getClass();
- int hashCode();
- String toString();
- booean equals();
- Class getClass();
- int hashCode();
- String toString();
Dog d = new Dog();
ArrayList<Object> arr = new ArrayList<Object>();
arr.add(d);
// Dog d = arr.get(0); // error다. ArrayList<Object>는 무조건 Object타입을 리턴한다.
Dog d = (Dog)arr.get(0); // 이건 된다. 강제로 캐스팅.
ArrayList<Object> arr = new ArrayList<Object>();
arr.add(d);
// Dog d = arr.get(0); // error다. ArrayList<Object>는 무조건 Object타입을 리턴한다.
Dog d = (Dog)arr.get(0); // 이건 된다. 강제로 캐스팅.
'Language > Java' 카테고리의 다른 글
| [Java] Head first java (5) (0) | 2008/03/26 |
|---|---|
| [Java] Head first java (4) (0) | 2008/03/26 |
| [Java] Head first java (3) (0) | 2008/03/25 |
| [Java] Head first java (2) (0) | 2008/03/25 |
| [Java] Head first java (1) (2) | 2008/03/20 |
| [Java] 각종 주석들 (0) | 2008/02/25 |
인스턴스 변수는 초기화 할 필요가 없다. (인스턴스 변수 : 메소드 밖에 있는 클래스의 변수)
숫자, char는 0으로 초기화 되고 bool타입은 false, 객체 레퍼런스는 null로 초기화 된다.
지역변수(메소드 안에 있는 변수)는 기본값이 없다. 즉, 초기화 해주어야 사용가능하다.
숫자, char는 0으로 초기화 되고 bool타입은 false, 객체 레퍼런스는 null로 초기화 된다.
지역변수(메소드 안에 있는 변수)는 기본값이 없다. 즉, 초기화 해주어야 사용가능하다.
갑자기 등장한 XP(익스트림 프로그래밍)..
1. 조금씩, 하지만 자주 발표한다.
2. 사이클을 반복해서 돌리면서 개발한다.
3. 스펙에 없는 것은 절대 집어넣지 않는다. (아무리 그 기능이 나중에 쓰일 것 같은 느낌이 들어도
그러지 않는게 좋다.)
4. 테스트 코드를 먼저 만든다.
5. 야근은 하지 말라. 항상 정규 일과시간에만 작업한다.
6. 기회가 생기는 족족 언제 어디서든 코드를 개선한다.
7. 모든 테스트를 통과하기 전에는 어떤 것도 발표하지 않는다.
8. 조금씩 발표하는 것을 기반으로 하여 현실적인 작업 계획을 만든다.
9. 모든 일을 단순하게 처리한다.
10. 두명씩 팀을 편성하고 모든 사람이 대부분의 코드를 알 수 있도록 돌아가며 작업한다.(짝프로그래밍)
1. 조금씩, 하지만 자주 발표한다.
2. 사이클을 반복해서 돌리면서 개발한다.
3. 스펙에 없는 것은 절대 집어넣지 않는다. (아무리 그 기능이 나중에 쓰일 것 같은 느낌이 들어도
그러지 않는게 좋다.)
4. 테스트 코드를 먼저 만든다.
5. 야근은 하지 말라. 항상 정규 일과시간에만 작업한다.
6. 기회가 생기는 족족 언제 어디서든 코드를 개선한다.
7. 모든 테스트를 통과하기 전에는 어떤 것도 발표하지 않는다.
8. 조금씩 발표하는 것을 기반으로 하여 현실적인 작업 계획을 만든다.
9. 모든 일을 단순하게 처리한다.
10. 두명씩 팀을 편성하고 모든 사람이 대부분의 코드를 알 수 있도록 돌아가며 작업한다.(짝프로그래밍)
순환문 코드 반복 횟수를 미리 알 수 있는 경우에는 while보다는 for를 쓰는게 좋다.
for(String name : nameArray) {}
자바라이브러리에 ArrayList가 기본적으로 내장되어 있다는 것을 아는것도 중요하지만,
우리가 필요로 하는 것이 바로 ArrayList라는 것을 아는 것이 더 중요하다.
우리가 필요로 하는 것이 바로 ArrayList라는 것을 아는 것이 더 중요하다.
java.lang패키지는 import하지 않아도 자동으로 들어간다.
그래서 String 같은 클래스를 그냥 쓸 수 있는 것이다.
그래서 String 같은 클래스를 그냥 쓸 수 있는 것이다.
'Language > Java' 카테고리의 다른 글
| [Java] Head first java (4) (0) | 2008/03/26 |
|---|---|
| [Java] Head first java (3) (0) | 2008/03/25 |
| [Java] Head first java (2) (0) | 2008/03/25 |
| [Java] Head first java (1) (2) | 2008/03/20 |
| [Java] 각종 주석들 (0) | 2008/02/25 |
| 상수 인터페이스 패턴 절대 쓰지 마라! (0) | 2008/02/12 |
클래스는 객체가 아니다.
클래스는 객체를 만들기 위한 용도. 즉, 하나의 틀이라고 할 수 있다.
클래스는 객체를 만들기 위한 용도. 즉, 하나의 틀이라고 할 수 있다.
변수는 크게 두가지로 나뉠 수 있다.
1. 원시 변수 : int, float, double
2. 레퍼런스 변수 : 객체를 가리키는 변수
1. 원시 변수 : int, float, double
2. 레퍼런스 변수 : 객체를 가리키는 변수
Dog dog = new Dog();
래퍼런스 변수(dog) 자체에 객체가 들어있는 것은 아니다.
dog변수는 객체의 포인터 변수가 되는 것이다. 즉, 주소를 가리키고만 있는 것이다.
Book a = new Book(); // 객체 생성, a는 생성된 객체를 가리킴
Book b = new Book(); // 객체 생성, b는 생성된 객체를 가리킴
a = b; // a는 b가 가리키던 객체를 같이 가리킴. 원래 a가 가리키던 객체는 가비지 컬랙션 대상이 되어 버림.
래퍼런스 변수(dog) 자체에 객체가 들어있는 것은 아니다.
dog변수는 객체의 포인터 변수가 되는 것이다. 즉, 주소를 가리키고만 있는 것이다.
Book a = new Book(); // 객체 생성, a는 생성된 객체를 가리킴
Book b = new Book(); // 객체 생성, b는 생성된 객체를 가리킴
a = b; // a는 b가 가리키던 객체를 같이 가리킴. 원래 a가 가리키던 객체는 가비지 컬랙션 대상이 되어 버림.
자바에서는 소숫점은 기본적으로 double로 인식하기 때문에 float를 쓰고 싶다면
float a = 0.14f; // f를 꼭 써줘야 한다.
float a = 0.14f; // f를 꼭 써줘야 한다.
배열도 객체이다. 즉, 나란히 값이 들어가 있는 메모리 공간을 가리키고 있는 레퍼런스이다.
int[] aa = new int[7];
int[] aa = new int[7];
자바는 모든것을 값으로 전달한다.
자바에서는 값을 전달할때 복사본을 전달합니다.
foo.go(x); // 호출
void go(int a){} // 호출되는 메소드
x의 복사본이 a로 전달되는 것이다. 즉, a의 내용이 변형된다고 해서 x가 변형되는 것은 아니다.
메소드에 객체에 대한 레퍼런스를 전달하면 그 리모컨의 복사본을 전달하게 되는 것이다.
그러면... 참조 아닌가? 같은 객체를 가리키고 있는 변수가 아니냐는 말이다...-_-;;;
여기에 대한 답을 찾아야 할 듯 하다. C#에서는 확실히 참조였는데...
자바에서는 값을 전달할때 복사본을 전달합니다.
foo.go(x); // 호출
void go(int a){} // 호출되는 메소드
x의 복사본이 a로 전달되는 것이다. 즉, a의 내용이 변형된다고 해서 x가 변형되는 것은 아니다.
메소드에 객체에 대한 레퍼런스를 전달하면 그 리모컨의 복사본을 전달하게 되는 것이다.
그러면... 참조 아닌가? 같은 객체를 가리키고 있는 변수가 아니냐는 말이다...-_-;;;
여기에 대한 답을 찾아야 할 듯 하다. C#에서는 확실히 참조였는데...
// head first 116p
'Language > Java' 카테고리의 다른 글
| [Java] Head first java (3) (0) | 2008/03/25 |
|---|---|
| [Java] Head first java (2) (0) | 2008/03/25 |
| [Java] Head first java (1) (2) | 2008/03/20 |
| [Java] 각종 주석들 (0) | 2008/02/25 |
| 상수 인터페이스 패턴 절대 쓰지 마라! (0) | 2008/02/12 |
| 가변객체를 참조하는 final 필드... (0) | 2008/01/31 |






Prev
Rss Feed