[자바 기초] 객체 Object

객체

객체 지향 언어

  • 객체 지향 언어(Object-Oriented Language)의 정의
    • 현실세계에 존재하는 사물이나 개념을 소프트웨어로 작성하는 것
  • 객체 지향 언어의 특징
    • 캡슐화 Encapsulation
      • 추상화를 통해 정리된 데이터와 기능들을 하나로 묶어 관리하는 기법
      • 데이터와 알고리즘을 객체로 묶어 관리하여 사용하기 편리함
      • 객체를 캡슐로 싸서 객체 내부를 보호(정보 은닉 Information Hiding)
    • 상속 Inheritance
      • 기존의 코드를 재활용 하기 위한 기법
      • 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스)를 생성
    • 다형성 Polymorphism
      • 객체가 취하는 동작이 상황에 따라서 달라지는 것을 의미
      • 부모 타입으로부터 파생된 자식 객체들을 부모 클래스 타입으로 다룰 수 있는 기술
    • 추상화 Abstraction
      • 불필요한 정보는 숨기고 중요한 정보만을 표현하여 프로그램을 만드는 기법

객체

  • 객체의 정의
    • 클래스의 정의된 내용에 따라 new 연산자를 통해 메모리 영역에 생성된 것
  • 객체의 할당
    • new 연산자와 생성자를 이용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/할당 image
  • 객체의 구성
    • 필드(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);
      	}
      }
    
    1. 클래스 Circle을 정의
    2. 객체를 생성하는 첫번째 단계로 참조 변수를 선언
    3. new 연산자를 통해 객체를 생성하고 객체의 참조 값을 참조 변수에 저장
      1. new 연산자는 객체를 Heap 메모리 영역에 생성한 후 객체의 참조 값을 반환
      2. 코드에서는 해당 참조 값을 저장
      1. 객체의 필드와 메소드를 사용하는 단계
      2. 객체의 필드나 메소드에 접근할 때 점(.) 연산자 사용

메소드

  • 메소드의 정의
    • 클래스 안에 선언된 특정한 작업을 수행하는 문장들의 모임
      반환명 메소드이름 (매개변수1, 매개변수2 , ...) {
      	//메소드 몸체
      }
    
  • 인수와 매개변수
    • 인수 Argument
      • 호출하는 곳에서 메소드 호출 시 전달하는 값
    • 매개 변수 Parameter
      • 메소드에서 값을 받을 때 사용하는 변수
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)는 클래스 당 하나만 생성되는 변수
      • 정적 변수는 객체 없이도 사용이 가능
  • 정적 변수의 활용
    • 자바에서는 전역 변수의 개념이 없기 때문에 모든 변수는 클래스 외부에서 접근 불가능
    • 정적 변수를 사용하여 전역 변수와 같이 사용, 클래스 외부에서 접근 가능
  • 정적 메소드
    • 정적 변수와 동일하게 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());
      	}
      }
    
    1. 참조 변수 선언
      1. 자바에서 배열은 객체이기 때문에 배열을 참조할 수 있는 참조 변수를 필요로 함
    2. 배열 객체 생성
      1. 배열 객체를 생성, 배열 요소들 생성되지 않음
    3. 배열 요소 생성
      1. 반복문을 통해 배열의 크기만큼 객체를 생성하여 배열 요소에 저장
    4. 배열 요소 처리
      1. 반복문을 통해 배열에 저장된 객체를 처리

You might also enjoy