Java HelloWorld
스태틱 메모리의 활용
핵심은 메모리의 공유. 예를 들어서 위의 그림처럼 객체를 10개를 new해서 생성한다고 해보자.
이중 멤버 변수 하나가 static이라면, 다른 개체들이 모두 이 static 변수의 메모리를 공유한다는 것.
『chap04\StaticConcept.java』
ⓙ───────────────────────────────────────
/**
static 멤버 필드를 테스트하는 예제
**/
public class StaticConcept {
//static 멤버 변수 s는 하나의 메모리만 생성하기 때문에
//어느 곳에서 값을 바꾸든 하나의 메모리를 상대하는 것이 된다.
public static int s; //스태틱 멤버 변수 선언
public int a; //일반 멤버 변수
public int b; //일반 멤버 변수
public int c; //일반 멤버 변수
public int d; //일반 멤버 변수
public int e; //일반 멤버 변수
public static void main(String[] args) {
StaticConcept sc0 = new StaticConcept(); //객체 생성
StaticConcept sc1 = new StaticConcept(); //객체 생성
StaticConcept sc2 = new StaticConcept(); //객체 생성
//멤버 변수에 데이터 할당
sc0.s = 1; sc0.a = 1; sc0.b = 2; sc0.c = 3; sc0.d = 4; sc0.e = 5;
sc1.s = 10; sc1.a = 10; sc1.b = 20; sc1.c = 30; sc1.d = 40; sc1.e = 50;
sc2.s = 100; sc2.a = 100; sc2.b = 200; sc2.c = 300; sc2.d = 400; sc2.e = 500;
//멤버 변수의 데이터 출력
System.out.println( "sc0:" + sc0.s +","+ sc0.a +","+ sc0.b +","+ sc0.c +","+ sc0.d +","+ sc0.e);
System.out.println( "sc1:" + sc1.s +","+ sc1.a +","+ sc1.b +","+ sc1.c +","+ sc1.d +","+ sc1.e);
System.out.println( "sc2:" + sc2.s +","+ sc2.a +","+ sc2.b +","+ sc2.c +","+ sc2.d +","+ sc2.e);
} //end of main
} //end of StaticConcept class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap04>javac StaticConcept.java
C:\javasrc\chap04>java StaticConcept
sc0:100,1,2,3,4,5
sc1:100,10,20,30,40,50
sc2:100,100,200,300,400,500
***/
───────────────────────────────────────ⓑ
위는 static 멤버 필드를 테스트하는 예제이다.
스태틱의 문제점
여러 곳에서 데이터를 원할 떄 동기화의 문제.
예를 들어 공유되어 있는 프린터로 여러 명이 프린트할 내용을 보낸다면 어떠한 원칙 아래 프린트가 이루어져야 합니다. 그렇지 않으면 출력은 엉망이 되고 말 것입니다. 이러한 것을 해결하기 위해서는 프리트할 문서에 대해서 순서를 정해야만 합니다. 이러한 줄서기 개념의 프로그램 기법을 동기화(Synchronization)라고 합니다. 이 문제에 대해서는 스레드(Thread)를 다룰 때 자세히 논하게 될 것입니다.
JVM
- 바이트 코드
컴퓨터가 이해할 수 있는 언어로 변환하는 과정을 컴파일이라고 한다. 링킹은 작성된 프로그램이 다른 라이브러리를 사용한다면 기계어로 된 라이브러리를 프로그램에 추가하는 작업을 말한다.
바이트 코드는 java 파일을 컴파일할 때 만들어지는 .class 파일이다. 완전한 기계어가 아닌 중간 단계의 언어이다.
- Virtual Machine
이러한 바이트 코드를 동작시키기 위해서 바이트 코드를 해석하고 실행하는 시스템이 필요한데 이 시스템을 가상머신(Virtual Machine)이라고 합니다.
- Basic Memory
일반적인 프로그래밍에서 사용하는 메모리는 2가지 종류로 나눌 수 있따. 스택과 힙.
- Garbage Collector
new 연산자를 이용해서 힙영역으로부터 빌린 동적 메모리는 delete를 이용해서 메모리를 해제해 주는 것이 원칙이다.
Overloading
언어의 기본적인 특성상 매개변수의 데이터 형이나 개수가 다르면 머슫 또한 다시 만들어야 하지만 오버로딩의 개념을 이용하면 이를 보다 편리하게 처리할 수 있습니다. 그리고 사용자 측면의 인터페이스는 훨씬 간단해지게 됩니다.
오버로딩
- 하나의 이름으로 여러 개의 메서드를 만들 수 있다.
- 매개변수의 개수와 타입에 따라 메서드가 호출된다.
Constructor
생성자도 하나의 메서드이기 때문에 반드시 매개변수의 개수와 형을 맞추어 주어야 생성자를 호출할 수 있습니다. new와 함께 사용되기 때문에 생성자의 매개변수를 맞추어 주지 않으면 객체는 생성되지 않을 것이다.
Inheritance
미리 만들어둔 클래스를 다시 이용하는 방법. 기존 C언어의 구조체에서는 없던 개념. 상속은 클래스에서만 통용되는 개념.
하위 클래스가 상위 클래스를 상속받았을 때, 하위 클래스는 상위 클래스의 모든 권한을 갖게 된다.
Overriding
오버라이딩이란 상위 클래스에 있는 메서드와 똑같은 메서드를 하위 클래스에서 다시 만드는 행위를 말합니다. 즉 하위 클래스에서 메서드를 재정의하는 것을 말합니다. 메서드 재정의(Overriding)를 개인적으로 '아버지 무시하기'로 부르고 있는데, 그 이유는 아들이 아버지의 메서드를 재정의했을 때 아버지의 메서드를 완전히 무시하는 경향이 있기 때문입니다. 메서드 재정의에 대해서 자세하게 알아보도록 하겠습니다.
.
This 접근자
this란 클래스를 만들 때 클래스 내부에서 사용할 수 있는 가상의 참조변수입니다. 참조변수는 객체의 메모리가 생성된 후에나 사용할 수 있는 변수입니다. 하지만 this는 객체의 메모리가 생성되리라는 가정하에 클래스 내에서 사용할 수 있습니다. 즉 메모리가 생성된 후가 아니라 클래스를 만들고 있을 때 사용할 수 있는 가상의 참조변수입니다.
▣ this 키워드
◈ 클래스를 만들고(디자인) 있을 때 클래스 내부에서만 사용할 수 있는 가상의 참조변수
클래스라는 것은 하나의 데이터 타입이며, 데이터 타입으로 여러 개의 객체를 생성할 수 있습니다. 하지만 클래스를 만들고 있을 때의 this는 가상의 참조변수 this입니다. 그리고 메모리가 생성된 후에 this는 각각의 메모리의 참조변수가 되는 것입니다. this에 대한 정의를 다음과 같이 내릴 수 있습니다.
▣ this의 정의
◈ 언젠가 생성될 객체의 참조값
Super 접근자
클래스를 디자인할 때 사용할 수 있는 가상의 참조변수는 this와 super 두 가지입니다. this는 앞에서도 설명한 바와 같이 클래스를 디자인할 때 사용할 수 있는 자기 자신의 참조변수에 해당합니다. 그리고 super는 클래스를 디자인할 때 상위 클래스를 참조할 수 있게 해주는 참조변수입니다. 여러분들은 오버라이딩을 학습하면서, 하위 클래스에서 상위 클래스를 재정의했다면 상위 클래스의 메서드는 무시된다는 것을 배웠습니다. 그럼 하위 클래스 입장에서 하위 클래스 내에서 무시해버린 상위 클래스의 메서드를 어떻게 접근할까요? super가 없다면 무시해버린 상위 클래스의 메서드를 호출할 방법이 없습니다. super 참조변수는 상속구조에서 클래스를 디자인하고 있을 때 상위 클래스의 변수를 참조하게 해주는 키워드입니다. 상위 클래스를 참조할 수 있는 유일한 방법이죠.
'백엔드 > 자바' 카테고리의 다른 글
자바 - Stream, 표준 스트림과 File 클래스 (1) | 2022.10.05 |
---|---|
자바 - Thread and Synchronization (배경, Thread의 기본) (0) | 2022.09.29 |
자바 - 클래스 (0) | 2022.08.25 |
자바 클래스의 개념 (0) | 2022.08.24 |
자바 언어에 관하여 (0) | 2022.08.19 |