자바의 클래스와 객체
1. 클래스와 객체
클래스를 실행시키면 클래스의 main 메서드가 실행되고 main 메서드 내부의 코드가 동작한다. main 메서드를 살펴보면 main(String[] args)로 표시되어 있어 main 메서드 실행시 문자열 배열을 인자로 전달받고 있다. 이 표시는 실제로 클래스 실행시 외부에서 데이터를 클래스의 main 메서드에 전달할 수 있다는 것을 의미함
클래스(Class)는 한 마디로 건물을 지을 때 제일 먼저 필요로 하는 설계도면과 같다. 객체(Object)는 설계도면을 통해 완성된 건물이다. 건물이 지어지면 건물에 주소(Reference)가 부여되고 주소를 통해 건물을 찾아갈 수 있다.
객체(Object)는컴퓨터, 책상, 사람, 강아지 등 현실 세계에서 흔히 찾아볼 수 있는 대상을 모델링한 것이다. 모든 사물을 프로그램의 객체로 만들 필요는 없고 프로그램에서 필요한 대상들만 객체화한다.
객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다. 객체는 속성과 동작으로 구성되어 있는데 자바에서는 이 속성과 동작들을 각각 필드(field)와 메서드(method)라 부른다.
객체로 정의된 대상들의 관계를 표현하는 프로그래밍이 객체 지향 프로그래밍이다.
2. 클래스의 구조
(1) 클래스 헤더
클래스 헤더는 클래스를 선언하는 부분을 의미
[접근제한] [클래스 종류] class 클래스명 public abstract Hello final |
- 접근제한
접근제한은 말 그대로 현재 클래스를 접근하여 생성하고 사용하는데 있어 제한을 두겠다는 의미. 클래스 접근제한은 public과 default 두가지를 사용할 수 있음
- 클래스 종류
클래스의 종류는 일반 클래스는 명시하지 않으면 추상클래스는 abstract를 명시하고 상속을 금지할 때 사용하는 final이 있음
- 클래스명
클래스의 이름을 의미. 식별자 명명규칙에 의해 대문자로 시작함.
public class Hello{ ….. } |
(2) 멤버필드
변수 또는 상수로 구성되어 있다. 상수는 고정된 값을 의미하며 프로그램이 종료 될 때까지 절대로 변하지 않는 값을 의미한다.
변수는 상수와는 반대로 프로그램이 종료 되기 전에 변경될 수 있는 값을 의미한다.
public class Hello{ int a; //변수 final int NUMBER = 10; //상수 } |
(3) 생성자
객체 생성시 호출되어 멤버변수를 초기화하는 역할을 수행. 생성자 내부에서 특정 작업을 수행할 수 있고 데이터를 인자에 전달하여 전달받은 데이터를 활용할 수도 있다.
(4)멤버 메서드
메서드는 특정한 일을 수행하는 행위, 다시 말해 동작을 의미한다. 메서드가 갖고 있는 코드를 수행할 수도 있고 멤버 필드가 가지고 있는 데이터를 활용해 동작을 수행할 수도 있다.
public class Hello{ //멤버메서드 public void drive(){ System.out.println(“운전하다”); } } |
3. 객체의 생성 및 멤버 접근법
1)객체 선언
객체가 생성되면 객체의 주소를 보관할 변수를 할당하는 과정. 변수를 할당할 때는 변수앞에 자료형을 명시해주는데 생성할 객체의 클래스명이 자료형으로 사용되고 해당 자료형을 참조자료형이라고 한다.
Student s;
2) 객체 생성
new 연산자를 사용하여 객체 생성을 희망하는 클래스의 생성자를 명시하고 메모리상에 객체를 생성한다. 객체가 생성되면 주소를 통해 객체에 접근할 수 있는데 주소를 참조변수에 보관하고 원할 때 참조변수를 통해 객체에 접근한다.
s = new Student();
(3) 멤버 접근법
참조변수에 저장된 객체의 주소를 통해 heap 영역에 생성된 객체의 멤버필드 또는 멤버 메서드를 호출한다.
s.study("국어");
4. 멤버변수와 멤버 메서드
(1)멤버 변수
1) 인스턴스 변수
객체가 생성될 때 각 객체들마다 따로 따로 생성 되어 고유의 값을 받아 각 객체의 속성으로 자리 잡는 변수가 바로 instance변수이다.
public class Hello{ String color; int memory; } |
public class Hello{ String color; int memory; static String maker; } |
(2) 멤버 메서드
1) 인스턴스 메서드
객체 생성시 객체에 포함되어 객체 범위에서 실행되는 메서드. 객체를 생성해야만 호출이 가능함
메서드의 구성 [접근제한] [반환형] [메서드명](자료형 인자1, 자료형 인자2,…){
수행문1; 수행문2; …; } public int add(int a, int b){ return a + b; } public class MethodEx { int var1,var2; // 멤버 변수
public int sum(int a, int b){ // 멤버 메서드 return a+b; } public static void main(String[] args){ MethodEx me = new MethodEx(); int res = me.sum(1000, -10); System.out.println("res="+res); } }
|
2) static 메서드
객체 생성과 무관하며 객체를 생성하지 않아도 메서드를 직접 호출할 수 있음
public static int add(int a, int b){ return a + b; } |
5. 패키지와 import
(1) 패키지
서로 관련 있는 클래스와 인터페이스를 하나의 단위로 묶는 것을 의미. 서로 관련있는 파일을 보관할 때 디렉토리를 사용하는 것처럼 동일 작업을 패키지로 그룹핑하는 작업을 할 수 있다.
package 경로명; |
(2) 패키지 사용 및 실행
클래스에 패키지 명시하기
package mypack.p1; public class MyPackOne{ public void one(){ System.out.println("MyPackOne클래스의 one메서드"); } } package mypack.p2; public class MyPackTwo{ public void two(){ System.out.println("MyPackTwo클래스의 two메서드"); } } |
(3) import문
같은 패키지의 클래스들은 클래스명만 명시해서 호출 가능하지만 다른 패키지에 있는 특정한 클래스를 사용하려면 패키지까지 명시해서 클래스를 호출해야 한다. mypack.p1 패키지의 MyPackOne이 mypack.p2의 MyPackTwo를 호출하려면 mypack.p2.MyPackTwo라고 명시해야 호출이 가능하다. 매번 이렇게 패키지를 함께 명시하지 않고 클래스명만 표시하기를 원한다면 import문을 사용할 수 있다.
package mypack.p1 import mypack.p2.MyPackTwo; public class MyPackOne{ public void one(){ MyPackTwo two = new MyPackTwo(); } } |
6. 접근지정자
멤버들은 객체 자신들만의 속성이자 특징이므로 대외적으로 공개되는 것이 결코 좋은 것은 아니다. 그런 이유로 프로그래머가 객체의 멤버들에게 접근 제한을 걸 수가 있는데 자바에서는 이를 접근 제한자라 한다.
접근지정자의 사용
클래스 : public, default 생성자 : public, protected, default, private 변수, 메서드 : public, protected, default, private |
6. 캡슐화
캡슐화란 객체의 필드, 메서드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메서드만 이용할 수 있다. 필드와 메서드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.
public class Hello{ private int a; public int getA(){ return a; }
public void setA(int n){ a = n; } } |
7. 인자 전달 방식
(1) 값 호출(Call by value)
기본 자료형의 값을 인자로 전달하는 방식. 값을 복사하여 전달
(2) 참조 호출(Call by reference)
메서드 호출시 전달하려는 인자를 참조(객체) 자료형을 사용할 경우를 의미. 주소(reference)를 복사하여 전달
(3) Varargs(Variable Arguments)
자료형이 일치할 때 전달하고자 하는 값의 갯수를 다르게 지정할 수 있다. 전달되는 데이터는 내부적으로 배열로 인식함