6장. 클래스와 객체
객체지향 프로그래밍 언어인 자바는 프로그램을 객체 단위로 구성해 상호 연동시킴으로써 프로그램을 실행함
클래스명은 대문자로 쓰기로 약속함
외부 구성요소
1. 패키지 : 반드시 주석제외 첫 줄에 위치해야함
if) 디폴트 패키지를 사용하면 생략
2. 임포트 : 다른 패키지의 클래스를 사용하고자 할 때 포함
3. 외부 클래스 : 1개의 .java파일에 여러 개의 클래스 포함 가능
( 단, 외부 클래스에는 public 키워드 사용 X )
내부 구성 요소
1. 필드 : 클래스의 특징(속성)을 나타내는 변수
ex) int age = 20;
2. 메서드 : 클래스가 지니고 있는 기능(함수)
ex) void working() {};
3. 생성자 : 클래스의 객체를 생성하는 역할
4. 이너 클래스 : 클래스의 내부에도 클래스가 포함될 수 있음
필드, 메서드, 이너 클래스를 ‘클래스의 멤버’ 라고함
클래스의 생성자로 객체를 만드는 과정 → 인스턴스화
인스턴스화로 만들어진 객체 → 인스턴스
객체 생성하기
클래스명 참조변수명 = new 생성자();
ex) A a = new A();
객체생성코드
자동차 car1 = new 자동차();
자동차 car2 = new 자동차();
*클래스 내용*
class 자동차 {
String color;
void drive() { … }
…
}
→ 포인트 연산자( . ) 사용하기
A a = new A();
System.out.println(a.m); // 필드 활용
a.print(); // 메서드 활용
7장. 클래스 내부 구성요소
필드와 지역 변수의 구분
필드 → 클래스에 포함된 변수, 힙 메모리에 생성됨
지역 변수 → 메서드에 포함된 변수, 스택 메모리에 생성됨
* 힙 메모리 객체 내 저장되는 필드는 객체가 사라지지 않는 한 절대 삭제되지 않음
메서드의 정의
자바제어자 리턴타입 메서드명(입력매개변수) {};
public static int sum(int a, int b) {
// 메서드 내용
}
void 메서드 안에 return의 의미는 ‘메서드를 종료하라’ 라는 의미임
클래스 외부에서 호출
→ 객체 생성 후 입력 매개변수에 해당하는 값을 통해 리턴값을 반환
클래스 내부에서 호출
→ 메서드끼리 객체를 생성하지 않고 서로 호출 가능
* 단, 메서드 앞에 static이 붙어있다면 static이 붙은 필드 or 메서드만 호출 가능
이 때, new 키워드를 사용해야 오류 발생 X
public static void main(String[] args) {
int[] a=new int[] {1,2,3};
printArray(a);
printArray(new int[] {1,2,3}); // printArray({1,2,3}) 오류
}
case 1. 기본 자료형 → 기본 자료형이 입력매개변수로 전달되면 전달받은 메서드는 값을 복사함
case 2. 참조 자료형 → 참조 자료형이 입력매개변수로 넘겨질 때 실체 객체 전달 X , 객체의 위칫값이 전달됨
메서드 시그니처
: 메서드명과 입력매개변수의 자료형
→ 메서드를 구분하는 기준 역할 , JVM은 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식함
메서드 오버로딩
: 입력매개변수의 개수나 자료형이 다른 여러개의 동일한 이름을 지닌 메서드를 같은 공간에 정의하는 것
리턴 타입 메서드명 (자료형 변수명, …) {}
int sum(int a, int b) {
return 3;
}
리턴 타입 메서드명 ( 자료형… 참조 변수명) {
…
}
method1(int… values) // 개수와 상관없이 정수 입력 받기
method2(String… values) // 개수와 상관없이 문자열 입력 받기
오버로딩만 사용했다면 입력매개변수를 하나하나 적어야했겠지만, 가변 길이 배열 입력매개변수를 사용함으로써 모든 메서드 호출에 대응 가능
반드시 클래스명과 동일한 이름으로 지어야함
리턴 타입 X
클래스명 (입력매개변수(생략O)) { }
생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가해줌
생성자 중괄호 안은 생성된 이후 할 일이 작성됨
→ 일반적으로 여기에서 필드를 초기화함
모든 메서드는 자신이 포함된 클래스의 객체를 가르키는 this라는 참조 변수가 있음
→ 클래스 내부 객체 공유시 원래는 this를 붙여줘야 하지만 없어도 컴파일러가 자동으로 붙여줌
→ 필드와 지역 변수를 모두 사용할 수 있고 이름이 같을 때 지역 변수로 인식
class A {
int m;
int n;
void init(int m,int n) {
this.m=m;
필드 지역 변수
this.n=n;
필드 지역 변수
}
}
자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령
클래스명이 A라면 this()는 A() 생성자를 호출하는 것
this(3)은 A(3) 생성자를 호출하라는 말
this() 메서드 특징
→ 생성자의 내부에서만 또 다른 생성자를 호출할 수 있음
( 메서드에서는 this() 메서드 사용 불가능 )
* 필드가 많아질수록 생성자의 중복을 제거하기 위해 this() 메서드가 필요하게 됨
class A {
int m1, m2, m3, m4;
A() {
m1=1;
m2=2;
m3=3;
m4=4;
}
A(int a) {
this();
m1=a;
}
A(int a, int b) {
this(a);
m2=b;
}
}
8장. 클래스 외부 구성요소
: 비슷한 목적으로 생성된 클래스 파일을 한곳에 모아 둔 폴더
1개의 프로젝트에 1개, 여러 개, 0개를 생성해도 됨
패키지의 장점 → 클래스가 저장되는 공간이 분리돼 클래스명의 충돌을 방지할 수 있음
: 다른 패키지 내의 클래스를 사용하기 위한 문법 요소
* 패키지 구문의 다음 줄에 위치함
클래스의 풀네임 사용
풀네임 → 패키지명.클래스명
ex) Java패키지의 A 클래스 객체를 생성하려고 할 때
→ A a = new A() (X)
→ Java.A a = new Java.A() (O)
** 이때 다른 패키지의 클래스인 A 앞엔 public이 붙어있어야함
임포트 사용
import 패키지명.클래스명
import Java.A;
* 패키지 내의 모든 클래스를 임포트하고 싶다면 *를 사용함
Java.*;
: public 클래스를 제외한 모든 클래스
public 클래스가 아니면 다른 패키지에서 임포트할 수 없으므로 외부 클래스는 같은 패키지 안에서만 사용 가능