본문 바로가기
Java/정리

[Java] 객체

by 콧등치기국수 2021. 5. 14.

1. 객체지향 언어 

- 컴퓨터 프로그램을 명령어의 목록으로 보는 시선에서 벗어나 현실 세계에서와 같이 여러 개의 독립된 단위, "객체"와 객체 간의 상호작용의 개념을 컴퓨터로 옮겨놓은 언어이다.

- 객체들이 메시지(Message)를 통하여 통신함으로써 원하는 결과를 얻는다. 각 개체는 데이터와 데이터를 처리할 수 있는 메소드로 구성된다.

1-1. 객체지향 3대특성

1. 캡슐화 : 클래스 외부에서 데이터에 대한 직접적인 접근을 막고대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법

1) 멤버변수에 대한 접근 권한 - [ private ]원칙 (잔액, 예금주명)

2) 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성

3) 멤버함수는 클래스밖 접근할 수 있도록 접근권한자 [ public ]으로 설정 (잔액조회, 예금주명 조회)

 

2. 상속

3. 다형성

 

2. 객체 

1) 현실세계 : 현실세계에서 다른 것과 구분되어 독립적으로 존재하는 것들 (유형 , 무형 , 개념 등등)

2) 자바 : 클래스에 정의된 내용으로 new연산자를 통해 메모리에 할당된 결과물

            데이터 + 메소드(데이터 변경,조작 가능)

 

2-1. 인스턴스(instance)

: 클래스로부터 생성된 객체 (객체 = instance)

 

2-2. 객체의 할당

- new연산자와 생성자를 통해서 객체를 생성한다.

-->heap메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열된 객체공간이 생김

 

클래스  ===(인스턴스화)===> 객체 

 

 

3. 클래스 ( 구조체 + 메소드(기능) )

- 객체를 생성하기 위해 필요한 개념

- 연관성이 있는 여러 자료형의 변수, 메소드(기능)들을 함께 묶어 놓은 단위(사용자 정의 자료형)이다.

 (부서명,사원이름,사원번호 등을 각각의 배열로 관리하는게 아니고 전체를 묶어서 관리)

 

- 공통적인 요소를 추상화하여 클래스를 정의

  (= 설계도, 붕어빵 틀)

 

3-1. 구조체, 배열, 변수 비교

변수 1개의 자료형, 1개의 데이터
배열 1개의 자료형, 여러 개의 데이터
구조체 여러 개의 자료형, 여러 개의 데이터

 

3-1-1. 구조체

-연관성이 있는 여러 자료형의 변수들을 한데 모아 묶어 놓은 단위(사용자 정의 자료형)

  ( 여러개의 자료형, 여러개의 데이터 )

 - 클래스와는 달리 기능(메소드)은 없다.

 

3-2. 클래스의 구조

[접근제한자] [예약어] class 클래스명 {  //접근제한자:public, default만 사용
				      //public(기재), default(생략)
    //필드부
    //생성자부
    //메소드부
    
}

==================================================

public class Member {
	
    private String name;                   //필드부
    
    public Member() {}                     //생성자부
    
    public String getName() {              //메소드부
    	return name;
    }
    public void setName(String name) {
    	this.name = name;    //this -> 객체 주소 가리킴
    }

* this : 모든 인스턴스의 메소드에 숨겨진 채 존재하는 레퍼런스로 , 할당된 객체를 가리킴
          함수실행 시 전달되는 객체의 주소를 자동으로 받음

 

3-2-1. 클래스의 구조(자세히)

public class명 {

     //필드부
     /* 1. 필드 : 객체의 속성을 저장하기위한 공간
		 * 
         * 멤버변수 == 인스턴스변수
         *
         * <표현법>
		 * 접근제한자 [예약어] 자료형 변수명 [= 초기값]; 
		 *
		 * 접근제한자는 private 으로 하는게 객체지향설계원칙 중 하나이다. --> 캡슐화
         * 접근제한자 : 접근할 수 있는 범위 제한할 수 있다.(public > protected(상속 간 관계) > default(같은 패키지) > private(해당클래스내부))
		 * */


     //생성자부 : 객체 생성하기 위한 일종의 메소드
     /* 매개변수가 없는 생성자: 기본 생성자 (생략 가능) 
      * 매개변수 있는 생성자 --> 생략 불가능 (매개변수가 있는 생성자가 있는 경우 매개변수가 없는 기본생성자도 생략 불가능)
      *
      * 접근제한자 클래스명([매개변수]) {  
      *    
      * }
      * 
      * 반환형이 없고, 반드시 클래스명과 동일하게 작성해야한다.
      **/

     //메소드부 : 기능을 구현
     /*
      * [접근제한자] [예약어] 반환형 메소드명 ([자료형 매개변수명]) {
      * 	수행내용;
      * 	[return 반환값;]
      * }
      * 반환값 없는 경우 반환형 -> void
      *
      * 접근제한자 -> public (외부에서 접근가능해야함)
      *             간접적으로 접근해서 값을 담거나 변경, 값을 가져올 수 있는 메소드
	  * -> private -> 그 멤버변수에 더이상 접근 불가
      */
     
     

 

3-3. 클래스 접근제한자

1) public (+) : 전체에서 접근 가능하다.

2) default (~) : 같은 패키지 내에서만 접근이 가능하다.

public class 클래스명 {
	//1.클래스 접근제한자 -> public
}

class 클래스명 {
	//2.클래스 접근제한자 -> default
}

 

3-4. 클래스 다이어그램

출처: kh정보교육원 교육자료

- 필드: (+)public (#)protected (~)default (-)private

 

 

4. 필드(Field)

- 프로그램 시작 시에 객체를 생성하지 않아도 정적 메모리 영역에 자동 할당되어 공유할 목적으로 생성.

 

 

4-1. 필드 예약어

1) final : 한번 설정하면 변경할 수 없는 변수

private final int TEMP1 = 4; 

 

 

4-2. 선언 위치에 따른 변수의 종류

1) 전역변수 : 클래스 내에서 어디서든 사용가능한 변수 / 필드부에서 선언

                 미초기화시 JVM이 기본값으로 초기화한다.

2) 지역변수 : 특정한 구역({ })안에 생성되어 그 지역에만 사용할수 있는 변수

                 지역변수는 반드시 초기화해야한다.

 

4-2-1. 전역변수

1) 멤버변수 (인스턴스 변수) 

* 생성 시점 : 클래스 내부에서 선언되며, new 연산자를 통해서 클래스의 객체 생성할 때 만들어진다.
* 소멸 시점 : 객체 소멸 시 같이 소멸

 

→ 즉 객체를 생성하지 않으면 사용할 수 없다!!

→ 객체변수가 객체화 시킬때마다 서로 다른 저장공간에 할당된다.

 

2) 클래스변수 (static 변수)

* 생성 시점 : 프로그램 실행(해당 객체 생성이 안되도)과 동시에 무조건 static 메모리 영역에 할당
* 소멸 시점 : 프로그램이 종료될 때 소멸

→ 즉 객체를 생성하지 않아도 사용할 수 있다!

→ 멤버변수와 달리 여러번 객체화 시켜도 공통적인 저장공간에 할당된다.

→ 공통적인 속성을 유지해야할경우 사용

public class FieldTest3 {

	public static String pubsta = "public static";
	private static String prista = "private static";
	
	public FieldTest3() {
		// TODO Auto-generated constructor stub
	}
	
	//pubsta(접근제한자 : public) -> 언제 어디서든 접근가능하기 때문에 setter,getter메소드가 필요없음
	//setter,getter -> private 변수에 대해서만 만들기
        //static예약어가 붙으면 메소드 또한 static을 붙여서 만들어야 한다.
	
	public static void setPrista(String prista) {  //여기도 static붙는다.
		//this.prista = prista;  //this -> 객체의 주소값 가지고 있음 / static은 객체 생성하지 않고 프로그램 실행과 동시에 static영역에 할당되므로 this가 존재하지 않는다.
		FieldTest3.prista = prista;

1) 접근제한자가 public인 static변수 -> setter, getter메소드 필요없다.

2) 접근제한자가 private인 static변수 -> setter, getter메소드(static붙여야 함) 필요.

3) static 변수 -> 메소드도 static 붙이기

4) this : 객체의 주소값을 가지고 있는데 static은 객체를 생성하지 않고 메모리에 바로 할당시키므로 this가 존재하지 않는다.

5)

public static void setPrista(String prista) { 
    FieldTest3.prista = prista;                          //클래스명.static변수 = 매개변수;

}

 

4-2-2. 지역변수

* 생성 시점 : 메소드 호출할 때 생성
* 소멸 시점 : 메소드 종료시에 소멸

 

 

5. 생성자 (반환형 X)

- 객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때, 객체 안에서 만들어지는 필드 초기화
- 생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록

 

5-1. 생성자 작성하는 목적

 1) 객체를 생성해주기 위한 목적
 2) 매개변수로 전달받은 값들을 필드에 바로 초기화할 목적

 

5-2. 생성자의 종류

1) 기본생성자

public User() {
		//단지 객체생성을 목적 할 때 사용
		//기본생성자를 생략하는 경우는 오류가 아니다 --> JVM이 자동으로 만들어줬기 때문에 항상 객체 생성이 가능했던 것
		//매개변수가 있는 생성자가 있는 경우에는 기본생성자라해도 생략이 불가능하다.
}

2) 매개변수가 있는 생성자

public User(String userId, String userPwd, String userName) {
		this.userId = userId;
		this.userPwd = userPwd;
		this.userName = userName;
		//나머지 필드부분이 있는 경우(userHeight 등) JVM이 넣어준 초기값으로 들어가있다.
}


 

5-2. 오버로딩

- 한 클래스 내에서 동일한 이름의 메소드를 여러번 생성하는 것

 

5-2-1. 오버로딩 조건

1) 메소드 이름이 같아야 한다.

2) 매개변수의 개수, 자료형, 순서가 달라야 한다. 

3) 매개변수의 개수, 자료형, 순서가 모두 같고, 접근제한자 또는 반환형이 다른 경우 -> 오버로딩 성립 불가

 

 

6. 메소드부

6-1. setter 메소드

- 필드(변수)에 변경할 값을 전달 받아서 필드 값을 변경해주는 메소드

 

6-1. getter 메소드

- 필드에 기록된 값을 읽어서 요청한 쪽으로 넘기는 메소드

 

 

 

 

 

 

출처 및 참고:

kh정보교육원 교육자료

slidesplayer.org/slide/17374266/

'Java > 정리' 카테고리의 다른 글

[Java] 상속(Inheritance)  (0) 2021.05.19
[Java] 문자열 compareTo()_문자열비교메소드  (0) 2021.05.17
[Java] 2차원 배열 문제  (0) 2021.05.12
[Java] 배열복사  (0) 2021.05.11
[Java] Math.random()  (0) 2021.05.08