- Q1-1)자바 클래스를 설계할 때 가장 근본적으로 고려해야 할 것은 무엇 일 까요?
- 객체에서 아는 것 : 인스턴스 변수
- 객체에서 하는 것 : 메소드
- Q1-2)어떤 의문점으로부터 출발해야 할까요?)
- 그 클래스 유형으로부터 생성되는 객체에 대해 생각해보자.
- Q1-3)클래스를 설계할 때 사용할 체크 목록을 만든다면 어떤 내용을 포함시키는 것이 좋을까요?)
- main 메소드의 두가지 용도
- 클래스를 테스트하기위한 용도
- 자바 애플리케이션을 시작하기 위한 용도
- 자바는 청소도 알아서 합니다.
- 자바에서 객체가 만들어지면 힙(Heap)이라는 메모리 공간에 저장됩니다. 모든 객체는 (언제, 어디에서, 어떻게 만들어졌든 상관없이) 힙에서 살지요. 하지만 우리가 기존에 알고 있던 메모리 힙과는 조금 다릅니다. 가비지 컬렉션 기능이 있는 힙이지요. 객체를 만들면 자바에서는 그 객체의 크기에 따라 힙안에 적당한 메모리 공간을 할당합니다. 예를 들어, 인스턴스 변수 15개가 있는 객체를 만들려면 아마도 인스턴스변수 두 개 만 있는 객체와 비교해서 공간을 더 많이 잡아먹겠죠? 그런데 그 공간을 되찾아오려면 어떻게 해야 할까요? 어떤 객체가 더 이상 필요 없을 때 어떻게 힙에서 치워버릴 수 있을까요? 자바에서는 그런 메모리 관리를 자동으로 처리해줍니다. JVM에서 어떤 객체가 절대로 다시 쓰이지 않을 것이라는 결론을 내릴 수 있으면 그 객체는 가비지 컬렉션 대상이 됩니다. 그리고 메모리가 모자라게 되면 가비지 컬렉터가 작동하면서 더 이상 사용할 수 없는 객체를 치워버려서 재화룡할 수 있는 메모리 공간을 확보합니다. 이 과정에 대해서는 다음 장에서 더 자세하게 알아 보겠습니다.
- Q : 전역 변수나 전역 메소드가 필요하면 어떻게 하죠? 모든 것을 클래스에 넣어야 한다면 그런 것을 넣을 자리가 없지 않아요?
- A : 자바 OO 프로그램에는 '전역' 변수 나 메소드의 개념이 아예 없습니다. 하지만 실제 프로그래밍을 하다 보면 프로그램의 어디에서든지 쓸 수 있는 메소드(또는 상수)가 필요한 경우가 있지요. 자동 구문 생성기 애플리케이션에서 썼던 random() 메소드를 생각해보세요. 이 메소드는 어디에서든지 호출할 수 있어야 합니다. 아니면 파이(pi) 같은 상두도 아무 데서나 쓸 수 있어야겠죠? 10장에서 배우게 되겠지만 메소드를 public으로, 그리고 static으로 지정하면 '전역' 메소드와 비슷하게 쓸 수 있습니다. public, static 메소드는 애플리케이션의 어떤 클래스의 어떤 코드에서든지 접근할 수 있습니다. 마찬가지로 변수도 public, static 그리고 final로 지정하면 어디에서든지 접근 할 수 있는 상수를 만들 수 있습니다.
- Q : 그러면 전역 함수나 전역 데이터를 만들면서 어떻게 객체 지향적이라고 할 수 있나요?
- A : 우선 자바에서는 모든 것이 클래스 안으로 들어갑니다. 따라서 pi라는 상수나 random() 같은 메소드도 모두 public 이면서 static이긴 하지만 Math 클래스 내에서 정의되어있습니다. 그리고 이런 정적인(static,'전역'과 비슷한) 것들은 자바에서 비교적 예외적인 것으로 생각해야 한다는 점을 꼭 기억해두세요. 이런 변수와 메소드는 인스턴스/객체 여래 개에 들어가지 않는 매우 특별한 경우에 해당합니다.
- .
- Q : 자바 프로그램이 뭔가요? 실질적인 최종 결과물은 무엇인가요?
- A : 자바 프로그램은 클래스 여러개가 모여있는 것(클래스 한 개만으로 구성 될 수 도 있습니다.)이라고 할 수 있습니다. 자바 애플리케이션에서는 여러 클래스 가운데 한 클래스에 main 메소드가 있어야 합니다. 그리고 그 클래스를 통해서 프로그램을 시작하게 되지요. 따라서 프로그래머 입장에서는 클래스 한 개 이상을 만들게 됩니다. 그리고 그런 클래스가 바로 최종적인 결과물이 되는 거죠. 만약, JVM이 없다면 프로그램을 실행시킬 수 없으니까 프로그램을 사용할 사용자한테 JVM도 포함시켜서 넘겨줘야 할겁니다. 클래스르 다양한 JVM(플랫폼마다 다른 걸 써야겠죠?) 과 함계 묶어주는 인스톨러 프로그램이 많이 나와있으니까 그런 것을 써서 CD롬과 같은 매체에 한꺼번에 넣어서 넘겨주는 식으로 해도 됩니다. 그러면 사용자는 (아직 JVM이 깔려있지 않다면) 자신의 플랫폼에 맞는 JVM을 골라서 설치할 수 있을 것입니다.
- /
- Q : 클래스가 수백, 또는 수천개가 된다면 어떻게 해야 할까요? 그런 파일을 일일이 전달하려면 너무 힘들지 않을까요? 그냥 전부 다 묶어서 하나의 애플리케이션 형태로 만들 수는 없나요?
- 물론, 그렇게 많은 파일을 일일이 사용자에게 전달하려면 참 골치 아프겠죠. 하지만 그렇게 하지 않아도 됩낟. 해당 파일을 자바 아카이브 (.jar 파일) 하나에 넣을 수 있으니까요(.jar 파일은 pkzip 유형을 바탕으로 만들어집니다.) jar 파일에는 manifiest라고 부르는 간단하게 포매팅된 텍스트 파일이 들어가는데, 바로 그 파일에 jar에 들어있는 파일 중에서 어떤 파일을 실행시켜야 할지를 알려 주는 (즉, 어떤 파일에 main() 메소드가 들어있는지 알려주는) 내용이 들어있습니다.
잉비니