독립적인 기능을 가지기 때문에 그 자체로 유용하고 손쉽게 재활용 할 수 있다. 기존 코드를 활용해서 새로운 코드를 상대적으로 쉽게 작성할 수 있고 , 코드 간의 관계 설정을 통해 적은 노력으로도 쉽게 코드를 변경 할 수 있다.
프로그램 개발 및 유지 보수에 드는 비용과 시간을 획기적으로 줄일 수 있고 , 객체를 통해 데이터를 관리하여 데이터 손실없이 관리하기에 용이함.
클래스(Class), 필드(Fild), 메서드(Method) 생성자(Constructor)
클래스(Class)와 객체(Object)
학습 목표
- 객체지향 프로그래밍의 가장 기본적인 토대인 객체를 이해할 수 있다.
- 객체를 만드는 데 필요한 클래스의 개념을 이해하고, 그 구성요소와 기본 문법을 설명할 수 있다.
- 객체의 두 가지 구성 요소, 속성과 기능이 무엇인지 이해할 수 있다.
- 클래스에 기반하여 new 키워드를 통해 객체를 생성하고, 이를 활용할 수 있다.
- 클래스와 객체의 차이에 대해 설명하고, 둘의 관계를 정의할 수 있다.
클래스는 객체를 정의한 틀, 객체는 클래스에 정의되고 틀대로 생성이됨 (붕어빵틀과 붕어빵관계)
클래스를 통해 생성된 객체를 클래스의 인스턴스라 부른다
객체와 인스턴스의 차이는?
둘다 혼용하여 사용하지만, 엄격하게 구분하자면 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고있고,
인스턴스는 해당 객체가 어떤 긐ㄹ래스로부터 생성된것인지를 강조한다.
클래스의 네가지 구성요소 // 생성자를 제외한 3가지 요소를 클래스의 맴버라 부름
public class ExampleClass{
int a = 10; //필드
void printX(){ . . . } // 메서드
ExampleClass { . . . } //생성자
class ExampleClass2{ . . . } // 이너클래스
-필드 : 클래스의 속성을 나타내는 변수,( 비행기 컬러 바퀴수 모델 등)
-메서드 : 클래스의 기능을 나타내느 함수 (비행기 시동하기, 가속하기 ,정지하기 등)
-생성자 : 클래스의 객체를 생성하는 역할
-이너클래스 : 클래스 내부의 클래스를 의미
필드와 메서드는 각각의 클래스가 가지는 속성과 기능을 대표함, 클래스와 관련 된 데이터의 집합이다
객체는 new 키워드로 생성할 수 있다.
생성방식
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후 , 객체의 주소를 참조 변수에 저장
먼저 특정 클래스 타입의 참조변수를 선언, 참조변수가 선언되면 new 키워드와 생성자를 통해 인스턴스를 생성하여 참조변수에 할당함
여기서 참조변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가리킴.
new키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 가지고 있고 생성자를 통해 객체가 만들어지면 해당 객체를 힙 메모리에 넣는역할을 함
참조변수는 데이터 값을 저장하는것이 아니라 실제 데이터가 위치해 이쓴 힙 메모리의 주소를 저장하는 변수를 의미함.
따라서 우리가 new 키워드와 생성자를 통해 클래스의 객체를 생성한다는것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는것과 같음.
그림에서 볼 수 있는 것처럼 클래스 Person과 참조 변수 p는 각각 클래스 영역과 스택 영역이라는 다른 위치에 저장됩니다.
한편 생성자로 만들어진 인스턴스는 힙 메모리 영역에 들어가며 객체 내부에는 클래스의 멤버들이 위치하게 됩니다. 앞서 설명드린대로, 참조변수는 객체의 실제 값이 아닌 힙에 저장되어 있는 주소값을 가리키게 됩니다.
여기서 또 한 가지 주목해야 하는 부분은 메서드의 구현 코드의 위치입니다. 보시는 것처럼 메서드 구현 코드는 클래스 영역에 저장되고 객체 안에서는 그 위치를 가리키고 있습니다.
즉 같은 클래스로 만든 모든 객체는 동일한 메서드 값을 공유하기 때문에 여러 번 같은 메서드를 선언해주는 것이 아니라 한번만 저장해두고 필요한 경우에만 클래스 영역에 정의된 메서드를 찾아 사용할 수 있는 것입니다.
메모리와 관련된 부분은 조금 복잡한 부분이기 때문에, 지금 당장 이해가 어렵다면 넘어가셔도 좋습니다.
다만 생성된 객체에서 필드값은 실제 저장공간이 객체 내부에 있다는 것과 메서드는 다른 영역에 하나만 저장해놓고 공유한다는 점만 기억합시다
필드와 메서드
학습 목표
- 객체의 속성을 정의하는 필드를 이해하고, 세 가지 종류의 변수를 구분할 수 있다.
필드는 클래스에 포함된 변수를 의미하는 것으로 속성을 정의할 때 사용됨.
클래스변수
인스턴스변수
지역변수
필드라 부르는 것은 클래스 변수와 인스턴스 변수이며 static키워드의 유무로 구분된다.
static키워드가 선언된 것은 클래스 변수 그렇지 않은것은 인스턴스 변수, 둘다 포함되지 않고 메서드 내에 포함된 모든 변수는 지역변수라 한다.
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
인스턴스 변수와 클래스 변수는 맴버변수
인스턴스 변수는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new생성자 를통해 인스턴스가 생성될 때 만들어진다.
- 각각의 변수가 저장되는 위치를 설명하고, 그 차이를 설명할 수 있다.
클래스 변수 = static키워드로 통해 선언된 클래스 변수는 독립적인 저장공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유함 따라서 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야하는 경우에 주로 static키워드를 사용하여 클래스 변수를 선언하게 됩니다. 예로들면 손가락과 발가락 갯수와 같이 모든 사람이 공유하는 특성을 저장하는데 사용된다. 또한 클래스변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않아더 안제라도 클래스명.클래스변수명을 통해 사용이 가능합니다. 위의 코드를 예를들면 Example.classVariable로 클래스 변수를 사용할 수있다.
인스턴스 변수 =힙메모리의 독립적인 공간에 저장/동일한 클래스로부터 생성되지만 객체의 고유한 개별성을 가짐.
지역변수 = 메서드 내에 선언되며 메서드 내 ({}블록)에서만 사용가능한 변수입니다. 멤버변수와 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 됩니다.
또한 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되지않는반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동으로 삭제됩니다.
변수와 지역변수의 주요한 한가지 차이점은 초기값에 있다. 직접 초기화 하지 않으면 값을 출력할 대 오류가 발생하는 지역변수와는 달리 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이뤄짐. 이것또한 메모리의 저장 위치와 긴밀한 연관성을 가짐, 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화 되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해 주어야합니다.
- static 키워드가 무엇이며, 언제 사용되는 지 설명할 수 있다.
static 키워드가 붙어있는 멤버를 정적멤버라 부르고 붙어있지 않은건 인스턴스 변수로 구분한다.
이 둘의 가장 큰 차이는 인스턴스 멤버는 기존에 우리가 배웠떤 내용처럼 반드시 객체를 생성한 이후에 변수와 메서드에 접근하여 해당 멤버를 사용가능한 반면 static키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성없이도 클래스명.멤버명 만으로도 사용이 가능하다는 점이다. 물론 정적 멤버도 객체를 생성 한 후 참조변수를 통해 사용이 가능하지만 ,애초에 정적 멤버임을 표시하기위해서 클래스명.멤버명 의 형태로 사용할 것을 권장하고 있습니다.
public class StaticTest {
public static void main(String[] args) {
StaticExample staticExample = new StaticExample();
System.out.println("인스턴스 변수: " + staticExample.num1); // static 키워드가 없는 인스턴스 변수
System.out.println("클래스 변수: " + StaticExample.num2); //static 키워드가 있는 클래스 변수
}
}
class StaticExample {
int num1 = 10;
static int num2 = -10;
}
//출력값
인스턴스 변수: 10
클래스 변수: -10
기억해야할 두가지
정적필드는 객체 간 공유 변수의 성질이 있다는 점. 이것은 메서드에도 동일하게 적용됩니다. 일반적인 메서드 앞에 static키워드를 사용하면 해당 메서드는 정적 메서드가 됩니다. 정적메서드도 정적필드와 마찬가지로 클래스명만으로 바로 접근이 가능하다.
두번째 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다는점. 정적 메서드는 인스턴스 생성없이 호출이 가능 하기 대문에 정적 메서드가 호출 되어있을 때 인스턴스가 존재하지 않을 수 있기 때문
public class StaticFieldTest {
public static void main(String[] args) {
StaticField staticField1 = new StaticField(); // 객체 생성
StaticField staticField2 = new StaticField();
staticField1.num1 = 100;
staticField2.num1 = 1000;
System.out.println(staticField1.num1);
System.out.println(staticField2.num1);
staticField1.num2 = 150;
staticField2.num2 = 1500;
System.out.println(staticField1.num2);
System.out.println(staticField2.num2);
}
}
class StaticField {
int num1 = 10;
static int num2 = 15;
}
//출력값
100
1000
1500
1500
보시는 것처럼 StaticField 클래스에 인스턴스 필드(num1)와 정적 필드(num2)를 각각 선언하고, 대조를 위해 staticField1와 staticField2 객체를 생성했습니다.
num1의 경우에는 각각의 변수가 고유성을 가지기 때문에 100과 1000으로 따로 출력되는 반면에, num2의 경우는 앞서 배웠던 것처럼 값 공유가 일어나 1500이 출력값으로 두 번 반복되고 있습니다.
이처럼 static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있습니다.
결론적으로 static 키워드는 클래스의 멤버 앞에 붙일 수 있습니다. 정적 멤버의 가장 큰 특징은 인스턴스를 따로 생성하지 않아도 클래스명만으로도 변수나 메서드 호출이 가능하다는 점이며, 이는 메모리의 저장위치와 관련이 있다는 사실을 알 수 있었습니다.
- 객체의 기능을 정의하는 메서드를 이해하고, 메서드의 구성요소와 호출에 대해 설명할 수 있다.
메서드는 특정 작업을 수행하는 일련의 명령문들의 집합을 의미하고, 머리에 해당하는 메서드 시그니처, 몸통에 해당하는 메서드 바디로 구분할수있다. 메서드의 시그니처는 순서대로 해당 메서드가 어떤 타입을 반환하는 가(반환타입), 메서드 이름은 무엇(메서드명)이며 해당 작업을 수행하기 위해서 어떤 재료들이 필요한지(매개변수)에 대한 정보를 포함하고있다.
메서드의 호출= 메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야합니다. 인스턴스를 생성한 후 포인트연산자(.)를 통해 메서드를 호출 할 수 있습니다.
클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출 할 수 있습니다.
메서드 호출시 괄화 안에 넣어주는 입력값을 우리는 인자라고 하는데 인자의 갯수와 순서는 반드시 메서드를 정의 할 때 선언된 매개 변수와 일치되어야합니다
- 메서드 오버로딩을 이해하고 그 장점을 설명할 수 있다.
메서드 오버로딩을 제대로 이해하기 위해서는 메서드 시그니처에 대한 개념이해가 먼저 선행되어야한다.
생성자(Constructor)
- 생성자의 핵심 개념과 기본 문법을 이해하고 사용할 수 있다.
객체를 생성하는 역할을 하는 클래스의 구성요소로서, 인스턴스가 생성될 대 호출되는 인스턴스 초기화 메서드라 정리할수있다.
new키워드를 사용하여 객체를 생성할 때 호출 되는것이 이 생성자 이다. 종종 생성자라는 이름에서 생성자가 인스턴스를 생성하는 역할을 한다는 오해가 발생하는데 사실이 아니고 인스턴스 생성을 담당하는 것은 new키워드이며 생성자는 인스턴스 변수들을 초기화하는데 사용되는 특수한 메서드라 할수 있다.
- 생성자가 메서드와 구분되는 두 가지 차이를 이해하고 설명할 수 있다.
1. 생성자의 이름은 반드시 클래스의 이름과 같아야합니다. 만약 클래스 이름과 생성자의 이름이 다르면 그 메서드는 더이상 생성자로서의 기능을 수행 할 수 없다.
2. 생성자는 리턴타입이 없다. 생성자도 오버로딩이 가능하므로 한 클래스 내에 여러개의 생성자가 존재할 수 있다.
- 메서드 오버로딩이 생성자에서 어떻게 구현될 수 있는 지 확인하고 이해할 수 있다.
오버로딩을 활용하여 같은 이름을 가진 ㅅ갱성자 여러개를 만들수 있습니다. 여기서 생성자의 모양에 따라서 객체를 생성하는 방법이 결정됩니다 예를 들면, 2번 생성자를 호출하기 위해서는 객체 생성ㅅ 시에 문자열을 전달해 주어야하고 3번 생성자를 위해서는 두개의 int형의 매개변수를 전달해 주어야합니다.
- 기본 생성자와 매개변수가 있는 생성자의 차이를 설명할 수 있다.
모든 클래스에는 반드시 하나 이상의 생성자가 존재해야한다
매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는데 사용됩니다.
- this 와 this() 의 차이에 대해 설명할 수 있다.
this()는 앞서 메서드의 호출 내용에서 같은 클래스안에 메서드들끼리 서로 호출할 수 있엇던것처럼 생성자도 상호 호출이 가능합니다
즉 this()메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용합니다. 예를들어 클래스명이 Car라는 클래스의 생성자를 호출하는 것은 Car()가아니라 this()이고, 그 효과는 Car()생성자를 호출하는 것과 동일합니다.
this()메서드를 사용하기 위해서는 크게 두가지의 문법요소를 충족시켜야합니다.
1. 반드시 생성자의 내부에서만 사용할 수 있습니다.
2. 반드시 생성자의 첫줄에 위치해야합니다.
public class Test {
public static void main(String[] args) {
Example example = new Example();
Example example2 = new Example(5);
}
}
class Example {
public Example() {
System.out.println("Example의 기본 생성자 호출!");
};
public Example(int x) {
this();
System.out.println("Example의 두 번째 생성자 호출!");
}
}
//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!
Example 클래스는 두 개의 생성자를 가지고 있습니다. 하나는 매개변수가 필요하지 않은 기본 생성자이고, 다른 하나는 int 타입의 매개변수를 받고 있는 생성자입니다.
그리고 두 번째 생성자 내부의 첫 번째 줄에 this() 메서드가 포함되어 있습니다.
이제 Example 클래스를 기반으로 만들어지는 인스턴스를 생성하면, 첫 번째 생성자가 호출되고 그 결과로 Example의 기본 생성자 호출! 이라는 문구가 출력됩니다.
다음으로 두 번째 생성자를 사용하여 객체를 만드는 과정에서 생성자가 호출되면 먼저 this() 메서드가 출력되어 다시 첫 번째 기본생성자가 호출되고, 그 다음으로 Example의 두 번째 생성자 호출! 이라는 문구가 출력됩니다.
this
인스턴스 변수와 매개변수를 이름만으로는 구분하기 어려워지는 문제가 발생하게되는데 이를 구분해주기 위한 용도로 주로 사용되는 방법이 this키워드입니다.
모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조변수가 있는데, 일반적인 경우에는 컴파일러가 this.를 추가해주기때문에 생략하는 경우가 많습니다. 즉 this는 인스턴스 자신을 가리키며, 우리가 참조 변수를 통해 인스턴스의 멤버에 접근할 수 있는것처럼 this를 통해 인스턴스 자신의 변수에 접근 할 수 있는 것입니다.
this는 주로 인스턴스의 필드명과 지역변수를 구분하기 위한 용도로 사용됩니다.
내부클래스
학습 목표
- 내부 클래스의 기본 개념과 장점에 대해 이해할 수 있다.
클래스 내에 선언된 클래스로 내부클래스를 사용하면 외부 클래스의 멤버들에게 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있습니다.
또한 외부적으로 불필요한 데이터를 감출수 있어 캡슐화(encapuslation)를 달성하는데 유용하다.
class Outer { // 외부 클래스
class Inner {
// 인스턴스 내부 클래스
}
static class StaticInner {
// 정적 내부 클래스
}
void run() {
class LocalInner {
// 지역 내부 클래스
}
}
}
위의 코드 예제는 외부 클래스와 그 안에 포함될 수 있는 세 가지의 내부 클래스의 종류를 보여주고 있습니다.
사실 클래스의 선언과 객체의 생성을 동시에 수행하는 일회용 내부 클래스인 익명 내부 클래스도 있지만, 우선순위가 낮기 때문에 편의상 이번 콘텐츠에서는 생략하도록 하겠습니다.
위의 코드 예제로 다시 돌아가서, 세 가지의 내부 클래스의 종류는 각각 인스턴스 내부 클래스, 정적 내부 클래스, 그리고 지역 내부 클래스로 구분할 수 있습니다. 기본적으로 내부 클래스는 외부 클래스 내에 선언된다는 점을 제외하면 일반 클래스와 차이점이 없습니다. 단지 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용의 편의성을 고려하여 만들어진 문법 요소입니다.
앞서 언급한 세 가지 내부 클래스는 변수가 선언 위치에 따라 인스턴스 변수, 클래스 변수, 그리고 지역 변수로 구분되는 것과 유사하게 그 위치를 중심으로 구분될 수 있고, 그 유효범위(scope)와 특성이 변수의 그것과 매우 유사하다고 할 수 있습니다.
- 선언 위치에 따른 내부 클래스의 종류와 특징에 대해 이해하고 설명할 수 있다.
인스턴스 내부 클래스(instance inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(static inner class) | 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) | 외부 전역 변수 |
지역 내부 클래스(local inner class) | 외부 클래스의 메서드나 초기화블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 |
- 내부 클래스의 종류에 따른 유효 범위와 접근성을 이해할 수 있다.
멤버 내부클래스
1. 인스턴스 내부클래스
class Outer { //외부 클래스
private int num = 1; //외부 클래스 인스턴스 변수
private static int sNum = 2; // 외부 클래스 정적 변수
private InClass inClass; // 내부 클래스 자료형 변수 선언
public Outer() {
inClass = new InClass(); //외부 클래스 생성자
}
class InClass { //인스턴스 내부 클래스
int inNum = 10; //내부 클래스의 인스턴스 변수
void Test() {
System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
}
}
public void testClass() {
inClass.Test();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
outer.testClass(); // 내부 클래스 기능 호출
}
}
// 출력값
외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)
인스턴스 내부 클래스는 외부 클래스의 내부에 위치해 있으며 뒤에서 학습하게 될 private 접근 제어자(해당 클래스 안에서만 접근 가능한 멤버에 사용)를 사용하고 있음에도 내부에서 외부 클래스의 인스턴스 변수와 정적 변수에 각각 접근하여 해당 값을 사용하고 있습니다.
또 한가지 유의할 사항은 인스턴스 내부 클래스는 반드시 외부 클래스를 생성한 이후에 사용해야 한다는 점입니다. 따라서 클래스의 생성과 상관없이 사용할 수 있는 정적 변수와 정적 메서드는 인스턴스 내부 클래스에서 선언할 수 없습니다.
2. 정적 내부 클래스
직전의 내용을 통해 우리는 내부 클래스가 기본적으로 외부 클래스의 존재에 의존하고 있다는 사실을 알 수 있었습니다. 만약 내부 클래스가 외부 클래스의 존재와 무관하게 정적 변수를 사용할 수 있게 하려면 어떻게 해야할까요?
이 경우에 사용할 수 있는 것이 바로 정적 내부 클래스입니다. 정적 내부 클래스는 인스턴스 내부 클래스와 동일하게 클래스의 멤버 변수 위치에 정의하지만, static 키워드를 사용한다는 점에서 차이가 있다고 할 수 있습니다. 뭔가 좀 익숙하게 들리지 않나요?
class Outer { //외부 클래스
private int num = 3; //내부 클래스의 인스턴스 변수
private static int sNum = 4;
void getPrint() {
System.out.println("인스턴스 메서드");
}
static void getPrintStatic() {
System.out.println("스태틱 메서드");
}
static class StaticInClass { // 정적 내부 클래스
void test() {
System.out.println("Outer num = " +sNum + "(외부 클래스의 정적 변수)");
getPrintStatic();
// num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
a.test();
}
}
//출력값
Outer num = 4(외부 클래스의 정적 변수)
스태틱 메서드
지역 내부 클래스
class Outer { //외부 클래스
int num = 5;
void test() {
int num2 = 6;
class LocalInClass { //지역 내부 클래스
void getPrint() {
System.out.println(num);
System.out.println(num2);
}
}
LocalInClass localInClass = new LocalInClass();
localInClass.getPrint();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.test();
}
}
//출력값
5
6
위의 코드 예제를 보면 지역 내부 클래스 LocalInClass가 메서드 안에서 선언되고 생성된 후에 정의된 메서드를 호출하여 외부 클래스의 변수들을 출력하고 있는 것을 확인할 수 있습니다.
앞서 언급한 것처럼, 내부 클래스는 기본적으로 개발자의 편의를 위해 서로 연관있는 클래스들을 연결시켜 준 것에 지나지 않습니다. 지금 단계에서는 특별한 문법요소에 집중하기보다 '오 이런 것도 있구나'라는 수준에서 참고하고 넘어가고, 나중에 필요한 경우에 다시 돌아와서 내용을 확인하는 것을 권장드립니다.
종합퀴즈
1.클래스
클래스가 없는 객체 생성은 불가능하다.
일반적으로 하나의 소스파일에 하나의 클래스를 정의하는것이 권장된다.
2.객체
객체는 new키워드를 통해 생성되고 포인트 연상자(.)를 통해 접근할 수 있다.
객체는 자바 메모리 구조 중 힙 메모리에 저장된다.
객체와 인스턴스는 기본적으로 같지만, 인스턴스는 특정 클래스와의 관계를 강조한다는 점을 강조하는 표현이다.
동일한 클래스로 만든 모든 객체는 같은 메서드 값을 공유하며 메서드는 최초에 클래스 영역에 선언된다.
참조변수의 타입은 기본적으로 인스턴스의 타입과 일치해야한다.
특정 인스턴스를 참조변수에 할당하면 해당 참조변수에는 할당한 인스턴스의 주소값이 저장된다.
객체의 속성과 기능은 각각 필드와 메서드로 표현된다.
같은 클래스로부터 생성되었더라도 인스턴스 변수를 통해 해당 객체의 고유한 속성을 정의 할 수 있다.
3.필드
자바 프로그래밍에서 필드는 객체의 속성을 정의할 때 사용된다.
필드는 클래스변수와 인스턴스 변수를 가리키며, static키워드의 유뮤로 구분할수있다.
자바 변수의 세가지종류 (클래스변수,인스턴스변수,지역변수)중 클래스변수는 동일한 클래스에서 생성된 객체가 공통적으로 공유하는 속성을 정의할때 사용한다.
클래스 변수는 인스턴스 생성없이 클래스명.맴버명 으로 사용이 가능하다.
4.세가지 변수
자바의 세가지 변수유형은 클래스변수 인스턴스변수 ,지역변수 이다.
인스턴스 변수는 인스턴스가 생성될때 생성된다.
일반적으로 특정 클래스로부터 생성된 모든 객체가 공유하는 속성을 클래스 변수로, 각 인스턴스의 개별적인 속성을 인스턴스 변수로 선언한다.
지역변수는 스택 메모리 영역에 저장되며 반드시 직접 초기화를 시켜주어야한다.
5.메소드
메서드란 자바 클래스에서 "특정작업을 수행하는 일련의 명령문들의 집합"을 의미하며 객체의 기능을 정의 할 때 주로 사용된다.
메서드는 메서드 시그니처와 바디로 구분할 수 있다.
메서드의 반환타입이 void인경우 return문을 생략할 수있다.
클래스 내부의 메서드끼리 별도의 객체 생성없이 상호 호출이 가능하다.
6.오버로딩
메서드 오버로딩이란 하나의 클래스 안에 동일한 이름의 메서드를 여러개 정의한것을 의미한다.
반환타입은 메서드 오버로딩에 영향을 주지 못합니다.
메서드 오버로딩의 대표적이 예시로 PrintStream 클래스의 println메서드가 있다.
메서드 오버로딩이 성립되려면 이름이 같아야하고 매개변수의 갯수 또는 타입이 달라야한다.
7.생성자
생성자는 인스턴스가 생성 될 때 호출되는 인스턴스 초기화 메서드이다.
생성자의 이름은 반드시 클래스 이름과 같아야하며, 리턴타입을 가지지않는다.
생성자도 오버로딩이 가능하다
모든 클래스에는 반드시 하나이상의 생성자가 존재해야한다.
8.this()
this키워드는 객체 자신을 의미하는 참조변수이며, 이를통해 객체 자신의 변수에 접근가능하다.
this키워드는 인스턴스가 자기자신을 가리킬 때 사용되므로 클래스 메서드 안에서는 사용하지 못한다.
this()메서드는 반드시 생성자 내부에서 사용되어야한다.
Cat 이라는 클래스 내에서 this() 메서드를 사용하는 것은 Cat()생성자를 호출하는 것과 같은 효과를 가져온다.
'TIL' 카테고리의 다른 글
[Java]컬렉션 (0) | 2022.09.14 |
---|---|
[Java]캡슐화(Encapsulation) (0) | 2022.09.13 |
[Java]기초 (0) | 2022.09.13 |
[Java]상속(Inheritance) (0) | 2022.09.13 |
느슨해진 마음가짐을 바로잡고자 시작하는 기록일지. (0) | 2022.09.07 |