학습할 것
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
0. OOP란?
객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며, 각 개체들 간의 관계를 서술하는 방식으로 프로그래밍 하는 기법을 말한다.
자바는 객체지향 프로그래밍(OOP)이 가능한 객체 지향 언어이다.
객체(object)란 간단히 이야기하자면 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있다.
다시 말해, 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍입니다.
이때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 합니다.
용어 간단 정리
1. 클래스(Class): 객체(Object)를 만들 수 있는 ‘틀’
- 1.1. 필드(Field) : 클래스 내에서 정의한 객체의 속성/상태(state)
- 1.2. 메서드(Method) : 클래스 내에서 정의한 객체의 행위(behavior)
- 1.3. 생성자(Constructor) : 클래스로부터 만들어진 인스턴스 변수를 초기화하기 위한 메서드
- 1.4. this 참조변수 : Constructor의 매개변수명과 Instance 변수명이 같을 경우 구별을 위해 사용하는 참조 변수
2. 인스턴스(Instance) : ‘틀’(Class)로부터 만들어낸, 메모리 상에 존재하는 실제 객체(Object)
- 2.1. new 키워드 : 인스턴스를 만들 때, ‘생성자’를 호출하기 위해 사용하는 키워드
1. 클래스 정의
객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.
자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 된다.
클래스의 구조
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.
생성된 인스턴스의 필드를 초기화 하는 특별한 메서드인 생성자(constructor)를 가진다.
1-1. 필드
필드는 해당 클래스 객체의 상태 속성을 나타내며, 멤버 변수라고도 불린다. 여기서 초기화하는 것을 필드 초기화 또는 명시적 초기화라고 한다.
- 인스턴스 변수: 메서드, 생성자 블록 밖에 생성되며 클래스 내부에 생성되는 변수, 비정적 변수이다.(static이 붙지 않음)
- 인스턴스 변수는 클래스에서 선언되기 때문에 클래스의 객체가 생성될 때 변수가 생성되고 객체가 소멸될 때 변수도 같이 소멸된다.(즉, 인스턴스 변수는 객체를 생성해야만 접근할 수 있다.)
- 지역변수와 달리 인스턴스 변수는 접근 지정자(Access Control Modifiers)를 쓸 수 있다. (클래스변수도 마찬가지) (public, private, protected...)
- 인스턴스 변수는 초기화 하지 않아도 기본값이 지정된다.
- 클래스 변수
- 인스턴스 변수와 유사하게 선언되지만, 메서드, 생성자 블록 외부의 클래스 내에서 static 키워드를 사용하여 선언됨.
- static 키워드를 붙일경우 한 클래스의 모든 인스턴스가 같은 값을 공유함
- 클래스 변수는 프로그램 실행 시작시 생성되고 실행 종료시 자동으로 소멸된다.
- 클래스 변수는 초기화를 따로 하지 않으면 기본값이 할당된다.
- 객체를 생성하지 않고 바로 접근할 수 있다.
1-2. 메서드
메서드는 해당 객체의 행동을 나타내며, 보통 필드의 값을 조정하는데 쓰인다.
- 인스턴스 메서드: 인스턴스 변수와 연관된 작업을 하는 메서드이다. 인스턴스를 통해 호출할 수 있으므로 반드시 먼저 인스턴스를 생성해야 한다.
- 클래스 메서드: 정적 메서드라고도 한다. 일반적으로 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다.
1-3. 생성자
생성자는 객체가 생성된 직후에 클래스의 객체를 초기화하는 데 사용되는 코드 블록이다. 메서드와 달리 리턴 타입이 없으며, 클래스엔 최소 한 개 이상의 생성자가 존재한다.
1-4. 클래스의 생성방법
class Class { // 클래스
String constructor;
String instanceVar; // 인스턴스 변수
static String classVar; // 클래스 변수
static { // 클래스 초기화 블록
classVar = "Class Variable";
}
{ // 인스턴스 초기화 블록
instanceVar = "Instance Variable";
}
Class() { // 생성자
constructor = "Constructor";
}
void instanceMethod() { // 인스턴스 메서드
System.out.println(instanceVar);
}
static void classMethod() { // 클래스 메서드
System.out.println(classVar);
}
}
클래스에서 사용될 수 있는 제어자
- 제어자(modifier)란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미
- 자바에서 제어자는 접근 제어자(access modifier)와 기타 제어자로 구분할 수 있다.
- 기타 제어자는 경우에 따라 여러 개를 함께 사용할 수도 있지만, 접근 제어자를 두 개 이상 같이 사용할 수는 없다.
- 이러한 접근 제어자와 기타 제어자는 조합에 따라 함께 사용할 수 있다.
1-5. 접근 제어자(access modifier)
- 자바에서 정보은닉을 위해 접근 제어자라는 기능을 제공한다.
- 접근 제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있다.
- 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다
- 클래스는 public과 default밖에 쓸 수 없다.
정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념.
사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.
자바에서는 다음과 같은 네 가지의 접근 제어자를 제공한다.
1. private
2. public
3. default
4. protected
범위는 다음과 같다.
1-6. 기타제어자
static
- static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.
- 인스턴스메서드와 static메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.
- static은 멤버변수, 메서드, 초기화 블럭에 사용될 수 있다.
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. - 클래스 변수는 인스턴스를 생성하지 않고도 사용가능 - 클래스가 메모리에 로드될 때 생성 |
메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. - static메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다. |
final
- 거의 모든 대상에 사용될 수 있다.
- 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.
- final은 클래스, 메서드, 멤버변수, 지역변수에 사용할 수 있다.
제어자 | 대상 | 의미 |
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. |
메서드 | 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. | |
멤버변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. | |
지역변수 |
abstract
- 미완성의 의미를 가지고 있다.
- 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상메서드를 선언하는데 사용된다.
- abstract는 클래스, 메서드에 사용된다.
- 추상 클래스는 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도' 이므로 인스턴스를 생성할 수 없다.
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. |
1-7. 제어자의 조합
자바에서는 접근 제어자와 기타 제어자를 한 대상에 함께 사용할 수 있다.
하지만 모든 경우가 가능한 것은 아니며, 대상에 따라 사용할 수 있는 조합은 아래와 같다.
대상 | 함께 사용할 수 있는 제어자 |
클래스 | public, (default), final, abstract |
메소드 | 모든 접근 제어자, final, static, abstract |
필드 | 모든 접근 제어자, final, static |
지역 변수 | final |
초기화 블록 | static |
또한, 자바에서는 제어자의 특성상 몇몇 제어자는 함께 사용할 수 없습니다.
1. 클래스에 final과 abstract는 함께 사용할 수 없습니다.
: final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 되며, abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로, 이 두 제어자는 클래스에 함께 사용할 수 없습니다.
2. 메소드에 static과 abstract는 함께 사용할 수 없습니다.
: abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데, static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
3. 메소드에 private과 abstract는 함께 사용할 수 없습니다.
: abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데, private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
4. 메소드에 private과 final은 함께 사용할 필요가 없습니다.
: 메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 충분히 전달될 수 있습니다.
인용 : http://www.tcpschool.com/java/java_modifier_ectModifier
2. 객체 만드는 법
클래스에서 객체를 생성하려면 new 키워드를 생성자 중 하나와 함께 사용하면 된다.
// Class Declaration
public class Dog{
// Instance Variables
String name;
String breed;
int age;
String color;
// Constructor Declaration of Class
public Dog(String name, String breed, int age, String color){
this.name = name;
this.breed = breed;
this.age = age;
this.color = color;
}
// method 1
public String getName(){
return name;
}
// method 2
public String getBreed(){
return breed;
}
// method 3
public int getAge(){
return age;
}
// method 4
public String getColor(){
return color;
}
@Override
public String toString(){
return("Hi my name is "+ this.getName()+
".\nMy breed,age and color are " +
this.getBreed()+"," + this.getAge()+
","+ this.getColor());
}
public static void main(String[] args){
Dog tuffy = new Dog("tuffy","papillon", 5, "white");
System.out.println(tuffy.toString());
}
}
/* output
Hi my name is tuffy.
My breed,age and color are papillon,5,white
*/
3. 메서드 정의
- 제어자 (modifier) : 접근 제어자 및 기타 제어자를 지정해 해당 메서드에 접근할 수 있는 범위를 명시 또는 부가적인 의미를 부여
- 반환타입(return-type) : 메서드가 모든 작업을 수행한 뒤에 반환할 타입을 명시
- 메서드 이름(method-name) : 메서드 이름은 동사로 지으며, 카멜케이스를 따른다
- 매개변수 리스트(parameter-list) : 메서드에 사용할 매개변수를 명시
// Java Program to Illustrate Methods
// Importing required classes
import java.io.*;
// Class 1
// Helper class
class Addition {
// Initially taking sum as 0
// as we have not started computation
int sum = 0;
// Method
// To add two numbers
public int addTwoInt(int a, int b)
{
// Adding two integer value
sum = a + b;
// Returning summation of two values
return sum;
}
}
// Class 2
// Helper class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating object of class 1 inside main() method
Addition add = new Addition();
// Calling method of above class
// to add two integer
// using instance created
int s = add.addTwoInt(1, 2);
// Printing the sum of two numbers
System.out.println("Sum of two integer values :"
+ s);
}
}
/* output
Sum of two integer values :3
*/
4. 생성자 정의
- 자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.
- 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
- EX) Car 클래스의 생성자 이름은 Car
생성자는 다음과 같은 특징을 가진다.
- 생성자는 반환값이 없지만 반환 타입을 void 형으로 선언하지 않는다.
- 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
- 하나의 클래스가 여러개의 생성자를 가질 수 있다. (생성자도 하나의 메소드 이므로 메소드 오버로딩이 가능)
ex)
Car(String modelName) {}
Car(String modelName, int modelYear) {}
Car(String modelName, int modelYear, String color) {}
Car(String modelName, int modelYear, String color, int maxSpeeds) {}
생성자 선언
1. 클래스이름() { ... } // 매개변수가 없는 생성자 선언
2. 클래스이름(인수1, 인수2, ...) { ... } // 매개변수가 있는 생성자 선언
생성자 호출
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method02 {
public static void main(String[] args) {
Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출
System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.
}
}
5. this 키워드
this 참조변수
this란 자바에서 인스턴스 자신을 가리키는 키워드이다.
이 키워드를 이용하여 클래스 안의 메서드, 생성자에서 해당 인스턴스의 값을 변경하거나 조작할 수 있다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
...
}
위의 예제처럼 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같을 경우에는 인스턴스 변수 앞에 this 키워드를 붙여 구분해야 한다.
자바의 this 참조변수를 사용해 인스턴스 변수에 접근할 수 있다.
this 참조변수를 사용할 수 있는 곳은 인스턴스 메서드 뿐이며 클래스 메서드에 사용될 수 없다.
this() 메소드
this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
this() 메소드에 인수를 전달하면, 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출한다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
Car() {
this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출함.
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method05 {
public static void main(String[] args) {
Car tcpCar = new Car(); System.out.println(tcpCar.getModel());
}
}
/* output
2012년식 소나타 검정색
*/
내부적으로 다른 생성자를 호출하여 인스턴스 변수를 초기화할 수 있다.
reference
https://ahnyezi.github.io/java/javastudy-5/
https://jeeneee.dev/java-live-study/week5-class/
https://lob-dev.tistory.com/entry/Live-StudyWeek-05-%ED%81%B4%EB%9E%98%EC%8A%A4
http://www.tcpschool.com/java/java_methodConstructor_method
https://github.com/ByungJun25/study/tree/main/java/whiteship-study/5week
http://www.tcpschool.com/java/java_modifier_accessModifier
https://www.programcreek.com/2011/11/java-access-level-public-protected-private/
https://www.geeksforgeeks.org/methods-in-java/?ref=gcse
https://www.geeksforgeeks.org/classes-objects-java/?ref=gcse
http://www.tcpschool.com/java/java_methodConstructor_constructor
http://www.tcpschool.com/java/java_methodConstructor_this
'Language > Java-Weekly-study' 카테고리의 다른 글
[Java] W07: 자바 패키지 (0) | 2022.07.10 |
---|---|
[Java] W06: 자바 상속 (0) | 2022.06.26 |
[Java] W04: 자바 제어문 (0) | 2022.06.11 |
[Java] W03: 자바 연산자 (0) | 2022.06.03 |
[Java] W02: 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.05.29 |