[자바 기초] 객체 Object
2021, Jun 29
객체
객체 지향 언어
- 객체 지향 언어(Object-Oriented Language)의 정의
- 현실세계에 존재하는 사물이나 개념을 소프트웨어로 작성하는 것
- 객체 지향 언어의 특징
- 캡슐화 Encapsulation
- 추상화를 통해 정리된 데이터와 기능들을 하나로 묶어 관리하는 기법
- 데이터와 알고리즘을 객체로 묶어 관리하여 사용하기 편리함
- 객체를 캡슐로 싸서 객체 내부를 보호(정보 은닉 Information Hiding)
- 상속 Inheritance
- 기존의 코드를 재활용 하기 위한 기법
- 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스)를 생성
- 다형성 Polymorphism
- 객체가 취하는 동작이 상황에 따라서 달라지는 것을 의미
- 부모 타입으로부터 파생된 자식 객체들을 부모 클래스 타입으로 다룰 수 있는 기술
- 추상화 Abstraction
- 불필요한 정보는 숨기고 중요한 정보만을 표현하여 프로그램을 만드는 기법
- 캡슐화 Encapsulation
객체
- 객체의 정의
- 클래스의 정의된 내용에 따라 new 연산자를 통해 메모리 영역에 생성된 것
- 객체의 할당
- new 연산자와 생성자를 이용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/할당
- new 연산자와 생성자를 이용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/할당
- 객체의 구성
- 필드(Field) : 객체 안의 변수
- 메소드(Method) : 객체 안의 함수
클래스
- 클래스의 정의
- 객체의 특성에 대해 정의(설계)한 것
- 캡슐화를 통해 기능을 포함한 개념, 사물이나 개념의 공통 요소를 추상화하여 정의
- 클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스(Instance)라고 함
- 클래스 작성
-
필드와 메소드를 정의
public class 클래스 이름 { 자료형 필드1; 자료형 필드2; ... 반환형 메소드1() {...} 반환형 메소드2() {...} ... }
- 정의된 필드와 메소드를 해당 클래스의 멤버(Member)라고 부름
-
-
객체 생성
class Circle { // 1) 클래스 정의 private int radius; private String color; public void setRadius(int radius) { this.radius = radius; } public int getRadius(){ return radius; } public void setColor(String color) { this.color = color; } public String getColor() { return color; } public double calcArea() { return Math.PI * radius * radius; } } public class CircleTest { public static void main(String[] args){ Circle obj; // 2) 참조 변수 선언 obj = new Circle(); // 3) 객체 생성 obj.setRadius(100); obj.setColor("blue"); // 4) 객체의 필드 접근 double area = obj.calcArea(); // 5) 객체 메소드 접근 System.out.println("원의 면적 : " + area); } }
- 클래스 Circle을 정의
- 객체를 생성하는 첫번째 단계로 참조 변수를 선언
- new 연산자를 통해 객체를 생성하고 객체의 참조 값을 참조 변수에 저장
- new 연산자는 객체를 Heap 메모리 영역에 생성한 후 객체의 참조 값을 반환
- 코드에서는 해당 참조 값을 저장
-
- 객체의 필드와 메소드를 사용하는 단계
- 객체의 필드나 메소드에 접근할 때 점(.) 연산자 사용
메소드
- 메소드의 정의
- 클래스 안에 선언된 특정한 작업을 수행하는 문장들의 모임
반환명 메소드이름 (매개변수1, 매개변수2 , ...) { //메소드 몸체 }
- 인수와 매개변수
- 인수 Argument
- 호출하는 곳에서 메소드 호출 시 전달하는 값
- 매개 변수 Parameter
- 메소드에서 값을 받을 때 사용하는 변수
- 인수 Argument
class Math {
public int add(int x, int y) {
// x와 y는 add()의 매개변수
return x + y;
}
}
public Class MathTest {
public static void main(String[] args){
int sum;
Math obj = new Math();
sum = obj.add(2,3)
// 2와 3은 인수로서 add()에 전달
System.out.println("합 : " + sum);
}
}
- 메소드 중복 정의(Overloading)
- 자바에서는 같은 이름의 메소드를 여러 개 정의 가능
- 메소드 중복 정의는 다형성을 구현하는 한 가지 방법
- 오버로딩을 사용할 때는 매개변수의 개수나 타입을 다르게 해줘야 함
class MyMath {
public int square(int i) {
return i * i;
}
public double square(double i) {
return i * i;
}
}
public Class MyMathTest {
public static void main(String[] args){
MyMath obj = new MyMath();
System.out.println(obj.square(100));
System.out.println(obj.square(5.5));
}
}
생성자
- 생성자 정의
- 객체가 생성될 때 객체를 초기화하는 특수 메소드
- 생성자 이름은 클래스 이름과 동일
- 기본 생성자 default constructor
- 매개변수가 없는 생성자
- 개발자가 생성자를 정의하지 않는 경우 자바 컴파일러가 기본 생성자를 자동으로 생성
- 기본 생성자에서 자동으로 모든 멤버 변수들을 기본 값으로 초기화
- 기본 생성자에서 필드가 수치형 변수일 경우 0으로, 참조형 변수일 경우 null로, 부울형 변수인 경우 false로 초기화
this 참조 변수와 this()
- this 참조 변수 정의
- 현재 객체를 가리키는 참조 변수
- 컴파일러에서 자동으로 생성
- 매개변수 이름과 필드 이름을 구별하기 위하여 사용
- this()의 정의
- 현재 클래스에서 존재하는 다른 생성자를 의미
- 매개 변수 생성자를 호출할 때 주로 사용
public class Circle {
private int radius;
public Cirlce(int radius){ this. radius = radius;}
public Circle() { this(0); }
public double calcArea() { return Math.PI * radius * radius }
}
접근 제어
- 접근 제어(access control)의 정의
- 클래스 내부의 멤버에 접근할 수 있는 정도를 한정함
- 접근 제어자의 종류
이름 | 동일 클래스 | 동일 패키지 | 자식 클래스 | 전체 |
---|---|---|---|---|
public (+) | O | O | O | O |
protected (#) | O | O | O | X |
(default) (~) | O | O | X | X |
private (-) | O | X | X | X |
접근자와 설정자
- 접근자와 설정자
- 정보 은닉을 통해 클래스 안의 데이터는 외부에서 마음대로 변경이 불가능
- 클래스 안에 있는 필드에 접근해야하는 경우에는 접근자(getter)와 생성자(setter)를 사용
- 접근자는 현재 필드 값을 반환하는 메소드
- 설정자는 현재 필드 값을 설정하는 메소드
클래스 멤버
- 클래스 멤버(정적 멤버)
- 여러 객체가 하나의 변수를 공유하여 사용
- 필드를 정의할 때 static 키워드를 사용
- 인스턴스 멤버와의 차이
- 인스턴스 변수(instance variable)는 인스턴스(객체)마다 별도로 생성되는 변수
- 각 객체에 이들 변수에 대한 독립적인 기억 공간을 갖으며 각기 다른 값을 갖고 있음
- 정적 변수(class variable)는 클래스 당 하나만 생성되는 변수
- 정적 변수는 객체 없이도 사용이 가능
- 인스턴스 변수(instance variable)는 인스턴스(객체)마다 별도로 생성되는 변수
- 정적 변수의 활용
- 자바에서는 전역 변수의 개념이 없기 때문에 모든 변수는 클래스 외부에서 접근 불가능
- 정적 변수를 사용하여 전역 변수와 같이 사용, 클래스 외부에서 접근 가능
- 정적 메소드
- 정적 변수와 동일하게 static 키워드를 사용하여 정의 가능
- 정적 메소드의 예로는 Math 클래스에서 사용하는 각종 수학 메소드들이 있음
객체 소멸
- 객체의 소멸
- 객체에 할당되어 있던 메모리를 회수
- 자바에서는 GC(Garbage Collection)가 자동으로 사용이 끝난 메모리를 수거
- GC는 객체를 가리키는 참조 변수가 하나도 남지 않은 경우 객체의 사용이 끝났다고 판단
- 강제적으로 객체를 소멸시키려면 참조 변수에 null을 대입
인수 전달 방법
- 자바에서는 메소드의 매개변수로 인수가 전달되는 방법은 기본적으로 call-by-value
- 인수의 값을 복사하여 매개 변수로 전달
- 기초형 변수가 전달되는 경우 call-by-value 방식으로 전달
- 객체를 메소드로 전달하는 경우 객체의 참조값이 복사되어 전달
- 객체를 인수로 전달하면 메소드 안에서 객체의 수정이 이뤄지는 경우 원본 객체가 변경됨
- 메소드가 객체를 반환할 때 객체의 참조값만 반환
- 자바에서는 배열도 객체이기 때문에 배열이 전달되는 경우에도 객체가 전달되는 것과 동일하게 처리
객체배열
객체 배열
-
객체 배열을 생성하려면 먼저 배열을 생성한 후에 각각의 배열 요소를 별도로 생성하여 저장
class Rect { private int width, height; public Rect(int width, int height){ this.width = width; this.height = height; } public double calcArea() { return (double)width*height); } } public class RectArrayTest { public static void main(String[] args) { // 1) 참조 변수 선언 Rect[] rectArray; // 2) 배열 객체 생성 rectArray = new Rect[5]; for(int i=0; i<rectArray.length; i++) // 3) 배열 요소 생성 rectArray[i] = new Rect(i, i); for(int i=0; i<rectArray.length; i++) // 4) 배열 요소 처리 System.out.println(i+"번째 사각형의 면적:" + rectArray[i].calcArea()); } }
- 참조 변수 선언
- 자바에서 배열은 객체이기 때문에 배열을 참조할 수 있는 참조 변수를 필요로 함
- 배열 객체 생성
- 배열 객체를 생성, 배열 요소들 생성되지 않음
- 배열 요소 생성
- 반복문을 통해 배열의 크기만큼 객체를 생성하여 배열 요소에 저장
- 배열 요소 처리
- 반복문을 통해 배열에 저장된 객체를 처리
- 참조 변수 선언