본문으로 바로가기
반응형

 

 

 

지난 포스팅에서 자바의 2차원 배열에 대해서 다뤘습니다.

 

 

이번 포스팅에선 자바의 객체에 대해서 다루고자 합니다.




 

 

 

 

 

 


● 객체지향언어

 

 

 

객체지향언어란,

 

 

현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 

발생하는 모든 사건들은 객체 간의 상호작용으로
이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것입니다.

 

 

 

 

 

 

일반적으로 자바에서 객체란,

 

클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것입니다.

 

 

 

 

 

그럼 클래스라는 것이 왜 등장했느냐,,

 

여러 타입의 변수를 저장하기 위해서 등장했는데요.

 

 

 

변수  <-  1가지 자료형을 하나밖에 넣지 못함

배열  <-  1가지 자료형을 여러 개 넣을 수 있으나, 다른 자료형을 넣지 못함

구조체 <- 여러 자료형을 여러개 넣을 수 있음

 

 

 

 

 

 

결국 클래스란

 

 

객체의 특성에 대한 정의를 한 것으로 캡슐화를 통해 기능을 포함한 개념으로,

사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의합니다.

 

 

추상화는 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미로,
프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정입니다.

 

※ 캡슐화는 밑에서 자세히 다뤄볼 예정이니 이해가 안 가더라도 참고하시면 됩니다.

 

 

 

 

 


클래스의 예로 빵 틀을 들 수 있습니다.

 

빵틀이 하나만 있으면 여러 종류의 빵을 만들 수 있겠죠.

 

 

 

 

 

 

 

그렇다면 추상화는 정확히 무슨 말일까요?

 

예시를 하나 듦으로써 이해해봅시다.

 

 

 


 

추상화 예시 - 국가에서 국민 정보 관리용 프로그램을 만들려고 할 때,
                   프로그램에서 요구되는 “국민 한 사람”의 정보를 추상화한다면?

 

 

 

국민에 관한 정보는 위와 같이 떠올릴 수 있겠죠.

국민에 공통점들을 하나씩 떠 올린 겁니다.

 

 

 

 

 

 

이걸 추상화를 한다면,

 

 

이런 식으로 변수명과 자료형을 지정해줄 수 있겠죠.

 

 

 

 

 

 

 

 

 

위에서 정리된 변수명과 자료형을

클래스 다이어그램으로 표현 시 아래와 같습니다.

 

 

 

 

 

클래스는 어느 정도 이해했고, 그럼 객체가 무엇이냐...

 

 

 

 

 

객체란,

 

현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로


객체 지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object) 입니다.

 

 

 

 

 

 

 

그림으로 표현하면 아래와 같습니다.

 

 

 

클래스라는 틀에 선언된 변수에 맞게 입력한 후(인스턴스화)

 

하나의 객체가 탄생됩니다.

 

 

 

 

 

 

 

 

그럼 이 생성된 객체를 할당해줘야 하는데요

 

 

 

위와 같은 예를 들 수 있습니다.

 

 

new 연산자와 생성자를 사용하여 객체 생성 시 heap 메모리 공간에
서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간이 객체의 할당입니다.

 

 

 

 

 

 

 

정리해보면 객체 지향의 특성은 아래와 같습니다.

 

 

 

 

 

 

 

 

 

여기서 캡슐화란 아래와 같습니다.

 

 

 

 

한 마디로 생성한 클래스의 멤버 변수에 대해

 

외부로부터 접근은 허용할 것이냐 아니냐의 차이입니다.

 

 

 

 

 

 

 

 


● 클래스

 

 

 

다음으로는 클래스 입니다.

 

설명은 위에서 했으니 바로 선언 예시부터 들어가겠습니다.

 

 

 

 

선언은 위와 같습니다.

 

 

 

 

 

 

 

바로 예시를 살펴보면 아래와 같습니다.

 

name 과 age 변수가 private으로 선언이 되어있기 때문에,

다른 클래스에서 해당 변수에 접근을 할 수가 없습니다.

 

 

따라서 getNamesetName 메서드를 생성해 

외부에서도 변수에 접근이 가능하게끔 할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

클래스 접근 제한자는 두 가지가 가능합니다.

 

publicdefault(생략 가능) 인데요.

 

 

 

 

public 접근 제한자를 입력하면 모든 패키지에서 해당 클래스가 사용 가능하지만,

 

default 접근제한자를 입력하면 같은 패키지 내에서만 사용 가능합니다.

 

 

 

 

 

 

 


● package와 import

 

 

 

소스 파일을 작성할 때 packageimport 문이 있는 걸 보셨을 겁니다.

 

 

혹여 해당사항을 작성해야 할 시 아래에 구성 순서에 맞게 작성하여야 합니다.

 

 

 

 

 

 

 

 

 

 

자바에서 package란,

 

 

서로 관련된 클래스 혹은 인터페이스의 묶음으로 폴더와 비슷한데요.

 

 

 

 


패키지는 서브 패키지를 가질 수 있으며 ‘ . ’으로 구분합니다.

 

 

 

 

 

아래는 패키지의 선언입니다.

 

 

 

기본적으로 우리가 자주 사용하는 random 함수도 util 패키지 안에 있습니다.

 

 

 

 

 

 

 

 

그럼 이 패키지 안에 있는 함수를 사용하려면 어떻게 해야 할까요??

 

해당 패키지 안에 있는 class를 import 해줘야 합니다.

 

 

 

 

 

import란 ,

 

 

사용할 클래스가 속한 패키지를 지정하는 데 사용하는데요.

import문을 사용하면 클래스를 사용할 때 패키지 명이 생략 가능합니다.

 

 

 

특별한 건 java.lang패키지의 클래스는 import를 하지 않고도 사용 가능한데요.

대표적인 예가 System  ,   String 등등 있습니다.

 

 

 

 

 

 

import문의 선언은 아래와 같습니다.

 

위에서 봤듯이 random 클래스를 사용하려면 

 

import java.util.Random

(util 패키지 안에 있는 Random 클래스를 사용)

 

위와 같이 해줄 수 있습니다.

 

 

 

 

 

 

 

 

하지만 import문을 쓸 때 주의사항이 있는데요.

 

이름이 같은 클래스가 속한 두 패키지를 import 할 때는

클래스 앞에 패키지 명을 붙여 구분해 주어야 합니다.

 

 

 

 

아래에 예가 있습니다.

 

Date라는 클래스는 util패키지에도 있고, sql 패키지에도 있습니다.

 

따라서 이름이 같은 특정 클래스를 사용할 때는 클래스 앞에 패키지 명을 적어주어 구분합니다.

 

 

 

 

 

 

 

 

 


● 필드

 

 

필드는 한마디로 클래스 내에 있는 변수와 같은데요.

 

 

필드 표현식과 예는 아래와 같습니다.

 

 

 

 

여기서 접근 제한자와 예약어가 생소할 수 있는데요.

 

접근 제한자는 위에 클래스의 접근 제한자와 동일한 맥락으로,

 

다른 클래스에서 해당 클래스 내에 있는 변수 사용을 허용할 것이냐 , 아니냐를 정할 수 있습니다.

 

 

 

 

 

 

 

필드 접근 제한자는 위와 같습니다.

 

 

 

 

 

 

 

필드 예약어는 두 가지 종류가 있는데요.

 

 

 staticfinal입니다.

 

 

 

 

 

static은,

 

같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,
프로그램 start시에 정적 메모리 영역에 자동 할당되는 멤버에 적용합니다.

 

 

표현식은 위와 같습니다.

 

 

 

 

 

 

 

 

final이란,

 

하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어입니다.

 

 

표현식은 위와 같습니다.

 

 

 

 

 

 

 

 

필드 초기화 순서는 위와 같습니다.

 

참고하시길 바랍니다.

 

 

 

 

 


● 생성자

 

 

다음 알아볼 것은 생성자입니다.

 


생성자는 일종의 메서드로, 전달된 초기 값을 받아서 객체의 필드에 기록합니다.

 

객체가 new연산자를 통해 Heap메모리 영역에 할당될 때
객체 안에서 만들어지는 필드를 초기화합니다.

 

 

 

 

 

 

 

생성자 규칙입니다.

 

반드시!!!!  클래스명과 생성자명은 같아야 합니다.

 

 

 

 

 

 

 

 

 

 

생성자 표현식의 예입니다.

 

 

 

 

 

생성자는 크게 두 가지로 나눌 수 있는데요.

 

 

기본 생성자매개변수 생성자입니다.

 

 

 

 

차이를 참고하시길 바랍니다.

 

 

 

 

 

 

매개변수 생성자에 있는 오버 로딩이라는 말이 익숙지 않을 수 있는데요.

 

 

오버 로딩이란,

 

 

한 클래스 내에 동일한 이름의 메서드를 여러 개 작성하는 기법입니다.

 

 

 

위는 오버 로딩 조건입니다.  참고 바랍니다.

 

 

 

 


 

 

추가로 알아볼 것은 생성자에서 자주 쓰이는 this인데요.

 

 

 

this란,

 

모든 인스턴스 메서드에 숨겨진 채 존재하는 레퍼런스로 할당된 객체를 가리킵니다.


this는 함수 실행 시 전달되는 객체의 주소를 자동으로 받습니다.

 

 

 

this의 사용 예시입니다.

 

 

 

 

 

 

 

 

 

 

 

위는 this()의 사용 예시입니다.

 

생성자, 같은 클래스의 다른 생성자를 호출할 때 사용하며 반드시 첫 줄에 선언합니다.

 

 

 

 

 

 

 

많은 내용을 학습했습니다. 

 

용어들이 생소할 뿐이지 복잡한 사고를 요구하는 부분은 아니어서

반복 학습하고 예제를 풀어보면 금방 이해가 될 겁니다.

 

 

 

 

 

 

그럼 객체의 예제를 살펴봅시다.

 

 

 

 

 

 

 

 


객체 예제


 

 

 

 

난이도 ★☆

 

 

 

예제 1

 

 

Q : 1. 편의점에서 판매하는 커피 상품에 대한 클래스를 작성
     2. 임의의 직업에 대한 클래스를 작성
   

     멤버 메서드에 대해서는 구체화된 기능은 필요 없으며, 메서드 이름만 작성한다.
     public void 메서드명() 형식으로 작성만 하면 됨.
     멤버 변수는 최소 5개, 멤버 메서드는 최소 3개 정도 작성한다.
  

 

 

 

 

 

 


 

 

 

 

class Coffee {
	private String 원두;
	private String 제조회사;
	private int 가격;
	private String 상품명;
	private int 용량;
	
	public void 뚜껑열기() {}
	public void 뚜겅닫기() {}
	public void 마시기() {}
}

class 개발자 {
	private String 분야;
	private String 사용언어;
	private String 소속기업;
	private int 연봉;
	private int 연차;
	
	public void 일() {}
	public void 휴식() {}
	public void 밥() {}
}

public class ClassPrac {

	public static void main(String[] args) {
		Coffee c = new Coffee();
		c.뚜껑열기();
		
		개발자 노예1 = new 개발자();
		노예1.일();
	}

}

 

 

 


 

 

 

 

 

 

난이도 ★

 

 

 

예제 2

 

 

Q : 아래의 클래스를 만든 후 동작확인이 되면, 각각의 클래스를 동일 패키지 안에 
     개별 파일로 만들어서도 동일하게 동작이 되는지 확인을 한다.

 

      

     1. Member 클래스  

         실행용 메서드로 기본 생성자를 통해 Member type의
         객체를 생성하고 changeName()를 이용해 값 변경 후
         printName()를 이용해 출력

 

     2. Product 클래스

        실행용 메소드로 기본 생성자를 통해 Product type의 객체를 생성하고
         information()을 이용해 출력

 

     3. Circle 클래스

        실행용 메소드로 기본 생성자를 통해 Circle type의 객체를 생성 후

        원의 둘레, 넓이 값 출력. 

        incrementRadius() 메서드를 통해 반지름 1 증가 후, 다시 원의 둘레, 넓이 값 출력.

 

 

 

 

 


 

 

 

package exam6 -> SampleClass.java

package exam6;


public class SampleClass {

	public static void main(String[] args) {
		
		System.out.println("======Member 패키지=======");
		Member m = new Member();
		m.chageName("김연경");  m.printName();
		
		System.out.println("\n======Product 패키지=======");
		Product p = new Product();
		p.information();
		
		System.out.println("\n======Circle 패키지=======");
		Circle c = new Circle();
		System.out.print("현재 원의 넓이는 : ");
		c.getAreaOfCircle();
		
		System.out.print("현재 원의 둘레는 : ");
		c.getSizeOfCircle();
		
		c.incrementRadius();
		
		System.out.print("현재 원의 넓이는 : ");
		c.getAreaOfCircle();
		
		System.out.print("현재 원의 둘레는 : ");
		c.getSizeOfCircle();
		
		
	}

}

 

 

 

 

 

package exam6 -> Member.java

package exam6;

class Member{
	private String memberId;
	private String memberPwd;
	private String memberName;
	private int age;
	private char gender;
	private String phone;
	private String email;
	
	public Member() {
		
	}
	
	public void chageName(String name) {
		this.memberName = name;
	}
	
	public void printName() {
		System.out.println(this.memberName);
	}
	
}

 

 

 

package exam6 -> Product.java

package exam6;

class Product {
	private String pName = "키보드";
	private int price = 250000;
	private String brand = "X오X드";
	
	public Product() {
		
	}
	
	public void information() {
		System.out.println("물건 이름은 " + this.pName +","
							+ "물건 가격은 " + this.price +","
							+ "물건 브랜드는 " + this.brand);
	}
}

 

 

 

 

package exam6 -> Circle.java

 

package exam6;

class Circle {
	private double PI=3.14;
	private int radius = 1;
	
	public Circle() {
		
	}
	
	public void incrementRadius() {
		this.radius++;
		System.out.println("현재 원의 반지름을 +1 했습니다.");
		System.out.println("현재 원의 반지름은 : " + this.radius);
	}
	
	public void getAreaOfCircle() {
		System.out.println(this.radius * this.radius * this.PI);	
	}
	
	public void getSizeOfCircle() {
		System.out.println(2 * this.radius * this.PI);
	}
	
}

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

이상 java의 객체를 마치겠습니다.

 

 

 

 

 

 

다음 포스팅에선 java 객체의 메서드에 대해 다뤄보고자 합니다.

https://healthdevelop.tistory.com/entry/java10

 

[Java] 자바 메소드 | java 접근제한자(private..) | java 반환형(void..) | getter | setter (java로 웹개발하기)(d

이전 포스팅에서 자바의 객체와 클래스, 필드, 생성자에 대해서 다뤄봤습니다. https://healthdevelop.tistory.com/entry/java9 이번 포스팅에선 자바의 메소드에 대해서 다루고자 합니다. 잠깐 복습을 하자

healthdevelop.tistory.com

 

반응형