자바의 Class에 대해 학습하세요.
객체 지향 프로그래밍이란 실제 세계의 모든 것을 객체로 취급하여 프로그래밍 하는 방법이다.
객체지향프로그래밍은 아래와 같은 특징이 있다.
캡슐화: 상태(변수)와 행동(메서드)이 하나로 묶은 것을 말한다. 이렇게 묶인 것을 자바에서는 클래스로 표현한다.
정보은닉: 외부로부터 접근을 제어하는 것을 말하며 접근제어자가 이에 해당합니다.
상속성: 이미 정의된 객체의 변수와 메서드를 다른 객체가 물려받는 것으로 부모클래스의 변수와 메서드를 그대로 물려받아 바로 사용할 수 있다.
추상화: 추상화란 중요한 특징들을 찾아내 간단하게 표현하는 것을 말하며 객체지향에서는 실제 사물을 클래스로 정의하는 것을 추상화라고 할 수 있다. 학생을 학생 클래스를 만드는것을 말하며 더 나아가 사람으로 추상화하는 것도 추상화라고 말한다.
다형성: 하나의 클래스나 메서드가 다양한 방식으로 동작하는 것을 말하며 위에서 말한 사람 클래스가 학생 클래스도 될 수 있는거와 같은 개념이다.
실제 객체를 의미하지않지만 객체를 정의하는 틀 또는 설계도라고 생각하면 된다.
클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메서드로 구성된다.
클래스로 선언되어있는 객체를 실제 사용하기 위해 메모리에 할당하여 사용하는 객체를 의미한다.
이러한 과정을 인스턴스화라고 하며 이러한 인스턴스는 여래 개를 생성할 수 있다.
생성된 인스턴스는 자시만의 필드(상태)를 가지며 클래스가 가지고 있는 메서드는 모든 인스턴스가 공유하게 된다.
new 키워드를 사용해서 새로운 객체를 생성할 수 있는데 클래스 앞에 new 키워드를 사용해주기만 하면 된다.
String s = new String();
Stundent st = new Stundent();
이렇게 하면 객체를 heap 메모리 영역에 공간을 할당해주고 메모리 주소를 반환해 주는 역할을 한다.
하지만 new 생성자를 이용하면 새로운 객체를 메모리에 할당하게 된다. 아래의 코드를 보면 String new로 생성했을때와 참조했을 때의 메모리주소 값을 비교해보았다.
public static void main(String[] args) {
// 메모리 주소 값을 숫자로 변환하여 찍어보기
String str1 = "a";
String str2 = "a";
// 결과가 같다는 걸 확인할 수 있다.
System.out.println(System.identityHashCode(str1)); // 159413332
System.out.println(System.identityHashCode(str2)); // 159413332
String str3 = new String("b");
String str4 = new String("b");
System.out.println(System.identityHashCode(str3)); // 1349393271
System.out.println(System.identityHashCode(str4)); // 1338668845
}
클래스의 행동(기능)을 정의한 영역을 말한다.
접근제어자 반환타입 메소드명(매개변수) {//선언부
//구현부
}
먼저 선언부와 구현부로 나눠보자면 선언부는 해당 메서드가 어떠한 특징?이있는지 선언하는 부분이고 구현부는 해당 메서드의 기능을 서술하는 부분이다.
선언부에 대해 알아보겠다.
반환타입
메소드가 모든 작업을 마치고 반환하는 데이터 타입을 말하며 자바에서 사용하는 모든 데이터 타입을 사용할 수 있다.
매개변수
메서드 호출 시 전달되는 인수의 값을 저장할 변수들을 말한다.
객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화하는 메서드를 생성자라고 한다.
이러한 생성자는 아래와 같은 특징이 있다.
아래는 학생객체를 생성하는 방법이다.
public class Student {
private String name;
private int age;
public Student() { //기본 생성자
}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
외부에서 생성자 호출 시 생성자의 매개변수를 통한 멤버변수의 초기화가 이루어지며 인스턴스 객체가 생성된다.
this 참조 변수는 인스턴스가 자기 자신을 참조하는데 사용하는 변수이며 해당 인스턴스의 주소를 가리키고 있다.
this는 위에 생성자의 예제에서 한번 봤는데 다시 가져와서 보면 매개변수로 받은 name, age와 인스턴스의 멤버변수명이 같은 걸 확인할 수 있다.
이러한 경우 this를 앞에 붙여주는걸 통해 멤버변수의 name, age를 구분할 수 있다.
public class Student {
private String name;
private int age;
public Student() { //기본 생성자
}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
this()는 생성자 내부에서만 사용가능하며 해당 클래스의 다른 생성자를 호출할 때 사용한다.
맨마지막 name과 age를 매개변수로 받는 생성자를 보면 this(name);을 사용하는데 이는 name을 매개변수로 받는 생성자를 사용하는 것이다.
public class Student {
private String name;
private int age;
public Student() { //기본 생성자
}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name, int age) {
this(name);
this.age = age;
}
}