Java 클래스
클래스입니다..
공부를 처음 시작할 때 자바는 객체 지향 프로그래밍이라고 하는데 이것이 무슨 말인가 하다가 이제부터 알 수 있습니다.
간단하게 보면 자동차를 만들 때 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 완성된 제품을 만들 듯이 소프트웨어 개발할 때에도 부품에 해당하는 객체들을 먼저 만들고 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍이라고 합니다.
객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말합니다.
예를 들어 물리적으로 존재하는 자동차, 비행기, 컴퓨터, 책과 추상적인 학과, 강의, 모두 객체가 될 수 있습니다.
자동차는 색상, 모델명,등의 속성과 달린다, 멈춘다 등의 동장이 있죠 자바는 이 속성과 동작들을 각각 필드와 메서드라고 부릅니다.
_(그림 나중에 여유 있을때 그려서 넣겠음)
현실 세계에서 일어나는 모든 현상은 객체와 객체 간의 상호작용으로 이루어져 있는데,
예로 들면 사람이 계산기의 기능을 이용한다고 했을 때 사람은 전자계산기에 원하는 숫자를 입력하면 전자계산기는 사람에게 계산 결과를 알려주는 상호작용을 합니다.
소프트웨어도 마찬가지로 객체들은 각각 독립적으로 전재하고, 다른 객체와 서로 상호작용하면서 동작합니다. 객체들 사이의 상호작용 수단은 메서드입니다. 객체가 다른 객체의 기능을 이용하는 것이 바로 메서드 호출입니다.
객체 지향의 특징으로는 많이들 들었듯이 캡슐화, 상속, 다향성을 들 수 있습니다.
캡슐화(Encapsulation)
객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말합니다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메서드만 사용 가능합니다.
상속(inheritance)
일반적으로 상속은 부모가 가지고 있는 재산을 자식에게 물려주는 것을 말합니다.
자식은 크게 노력없이 부모의 재산을 갖게 됩니다. 객체 지향 프로그래밍에서도 부모의 역할의 상위 객체와 자식 역할의 하위 객체가 있습니다. 상위 객체는 자기가 가지고 있는 필드와 메서드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해줍니다.
다향성(Polymorphism)
다향성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말합니다.
하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줍니다.
자바는 다향성을 위해 부모 클래스 or 인터페이스의 타입에는 모든 구현 객체가 대입될 수 있습니다.
클래스의 선언하는 방법을 알아보겠습니다.
번호 | 작성 규칙 | 예 |
1 | 하나 이상의 문자로 이루어져야 합니다. | Car. SprotsCar |
2 | 첫 번째 글자는 숫자가 올 수 없습니다. | Car. 3Car(x) |
3 | '$', '_' 외의 특수 문자는 사용 불가합니다. | $Car. _Car. @Car(x), #Car(x) |
4 | 자바 키워드는 사용할 수 없습니다. | int(x), for(x) |
클래스의 이름이 단일 단어라면 첫 글자만 대문자 나머지는 소문자지만 여러 다른 단어가 혼합된 이름을 사용한다면 각 단어의 첫머리 글자는 대문자로 작성하는 것이 관례입니다.
클래스의 이름을 정하면 "클래스의 이름". java로 소스파일을 생성해주면 됩니다.
public class 클래스이름 {
}
자동차로 예를 들면
public class Car {
}
class Tire {
}
객체 생성과 클래스 변수
클래스를 선언 후 컴파일을 했다면 객체를 생성할 설계도를 만들어진 셈입니다.
클래스로부터 객체를 생성하는 방법은 다음과 같이 new 연산자를 사용합니다.
new 클래스();
new는 클래스로부터 객체를 생성시키는 연산자입니다.
new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있습니다.
new 연산자로 생성된 객체는 메모리 힙(heep) 영역에 생성됩니다.
클래스 타입으로 선언된 변수에 new 연산자가 리턴한 객체의 주소를 저장하는 코드를 보면
클래스 변수; // "클래스" "변수"
변수 = new 클래스(); // "변수" = new "클래스"();
클래스 변수 선언과 객체 생성을 한 개의 실행문으로 작성 가능합니다.
클래스 변수 = new 클래스();
간단하게 Student 클래스를 선언하고 StudentExample 클래스의 main(0 메서드에서 Student 객체를 생성해 보겠습니다.
public class Student {
}
StudentExample 클래스
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른Student 객체를 참조합니다.");
}
}
출력시켜보면 이런 결과가 나옵니다.
여기서 알아야 할 것은 Student 클래스는 하나지만 new 연산자를 사용하면 사용한 만큼 객체가 메모리에 생성됩니다.
이러한 객체들은 Student 클래스의 인스턴스들입니다.
생성된 각각의 Student 객체는 자만의 고유 데이터를 가지면서 메모리에 활동하는데 s1과 s2가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체입니다.
여기서 보면 Student와 StudentExample 클래스의 용도에 대해 알아볼 필요가 있는데 클래스는 2가지 용도가 있습니다.
하나는 라이브러리(API : Application Program Interface) 용이고 다른 하나는 실행용입니다.
프로그램 전체 사용되는 클래스가 100개면 1개만 실행용이고 99개는 라이브러리입니다. 실행용에서는 main() 메서드를 작성해서 실행 클래스로 만듭니다.
public class StudentExample {
// 라이브러리로서의 코드(필드, 생성자, 메서드)
// 실행하기 위한 코드
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
프로그램이 단 하나의 클래스로 구성된다면 위와 같이 작성하는 것이 좋은 방법일 수 있지만, 대부분의 객체 지향 프로그램 라이브러리(부품 객체 및 완성 객체)와 실행 클래스가 분리되어 있습니다.
클래스의 구성 멤버 3가지
- 필드
필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳입니다. 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지는 않습니다. 변수는 생성자와 메서드 내에서만 사용되고 생성자와 메서드가 실행 종료되면 자동 소멸됩니다. 하지만 필드는 생성자와 메서드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재합니다. - 생성자
생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록입니다. 생성자의 역할은 객체 생성 시 초기화를 담당합니다.
필드를 초기화하거나. 메서드를 호출해서 객체를 사용할 준비를 합니다. 생성자는 메서드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없습니다. - 메서드
메서드는 객체의 동작에 해당하는 중괄호{} 블록을 말합니다. 중괄호 블록은 이름을 가지고 있는데 이것이 메서드 이름입니다. 메서드를 호출하게 되면 중괄호를 블록에 있는 모든 코드들이 일괄적으로 실행됩니다. 메서드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 합니다. 메서드는 객체 간의 데이터 전달의 수단으로 사용됩니다. 외부로부터 매개 값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.