JAVA - 클래스, 객체, 인스턴스, 자바빈즈

박종휘·2022년 10월 25일
0

JAVA - 국비

목록 보기
15/29
post-thumbnail

1. 클래스, 객체, 인스턴스

1-1. 클래스 (Class)

  • 객체를 만들어내기 위한 설계도 혹은 틀
  • 연관되어 있는 변수와 메서드의 집합

1-2. 객체 (Object)

  • 소프트웨어 세계에 구현할 대상
  • 클래스에 선언된 모양 그대로 생성된 실체
  • '클래스의 인스턴스(Instance)' 라고도 부른다.
  • 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
  • oop(Object-Oriented Programming)의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.

1-3. 인스턴스 (Instance)

  • 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
  • 즉, 객체를 소프트웨어에 실체화하면 그것을 '인스턴스'라고 부른다.
  • 실체화된 인스턴스는 메모리에 할당된다.
  • 인스턴스는 객체에 포함된다고 볼 수 있다.
  • oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
class Animal {
	...
}

public class Main {
	public static void main(String[] args) {
    	Animal cat, dog;	// 객체
        
        // 인스턴스화 
        cat = new Animal();		// cat은 Animal 클래스의 '인스턴스'
        						// 객체를 메모리에 할당
        
        dog = new Animal();
    }
}

1-4. 클래스, 객체, 인스턴스 차이

  • 클래스 vs 객체
    • 클래스는 "설계도", 객체는 "설계도로 구현한 모든 대상"을 의미한다.
  • 객체 vs 인스턴스
    • 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
    • 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
    • 객체를 '클래스의 인스턴스'라고도 부른다.
    • 엄격하게 객체와 인스턴스를 나누긴 어렵다.

2. 은닉성

2-1. 클래스와 접근 한정자

  • 클래스에 접근 한정자를 지정한 경우

    		접근 한정자			설명
      		public				객체 생성이 가능하다.
              					서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능하다.
                                  
            private				클래스에 적용할 수 없다.
            
            protected			클래스에 적용할 수 없다.
            
            default				동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다
            					(지금까지의 예제 형태)
  • 클래스의 분리
    • 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적이므로, 기능단위로 소스코드를 분리해야 한다.
    • 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
    • 일반적으로 클래스 정의에는 public 접근 한정자만 존재한다.
    • 하나의 소스코드에 하나의 public 클래스만 존재할 수 있다.
package hiding;

public class Main01 {

	public static void main(String[] args) {
		// 객체생성
		StudentJava2 stdjava = new StudentJava2();
        // 동일한 파일 안에 StudentJava2 클래스가 없기때문에 
        // StudentJava2 클래스를 만들기 전까지는 오류가 뜬다.
		
		// setter 임의의 데이터 세팅, name, age 모두
		stdjava.setAge(25);
		stdjava.setName("자바학생");
		
		// getter 출력, name, age 모두
		System.out.println( stdjava.getAge() );
		System.out.println( stdjava.getName() );
        
        // 객체안에 내용이 없으면 오류 
        // (즉, getter와 setter가 없으면 호출을 할 수 없음)
	}
}
package hiding;

public class StudentJava2 {
	// 은닉된 멤버변수 -> 현재 블록 안에서만 접근 가능함
	private String name;
	private int age;
	
	// getter 메서드 2개
	// 은닉된 멤버변수의 값을 읽는 방법
	public String getName() {
		return this.name;
	}
	
	public int getAge() {
		return this.age;
	}
	
	// setter 메서드 2개
	// 은닉된 멤버변수에 값을 넣는 방법
	public void setName( String name ) {
		this.name = name;
	}
	
	public void setAge( int age ) {
		this.age = age;
	}
}

2-2. 자바빈즈 (JavaBeans)

  • 자바 언어에서 사용하는 복합적인 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.
  • 자바빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련된 일련의 관례를 따라야만 한다.
  • 지켜야할 관례
    -> 클래스는 생성자를 가지고 있어야한다.
    -> 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야한다.

-> 이런식으로 구성되어 있는 것을 자바빈즈라고 한다.

2-3. 자바빈즈 사용 이유

** 캡슐화

  • 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화를 위한 도구이다.
  • 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
  • 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게 하고 코드를 명확히 함
  • 외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전, 부가적인 처리를 요구함
  • 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함
class Person {
	int age;
    
    void howOld() { 
    	System.out.print(age);
    }
    
class Main { 
	public static void main(String[] args) {
    	Person p1 = new Person();
        p1.age = -1;
        p1.howOld();
    }
}

-----------------------------------------------------------

class Person {
	private int age;
    
    public void setAge(int age) {
    	if(age >= 0) {
        	this.age = age;
        }else {
        	this.age = 0;
        }
    }
    
    void howOld() {
    	System.out.println(age);
    }
}

class Main {
	public static void main(String[] args) {
    	Pserson p1 = new Person();
        p1.setAge(-1);
        p1.howOld();
    }
}
result

-1
0
  • setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고, 접근 범위에 한해서 메소드로 대입 전 값을 처리 후 대입되게 하기 위해 사용된다.
class Person {
	private int age;
    private String name;
    private Strign hobby;
    
    private String gender;
    
    public void setGender(String gender) {
    	this.gender = gender;
    }
    
    public void setAge(int age) {
    	if(age >= 0) {
        	this.age = age;
        } else {
        	this.age = 0;
        }
    }
    
    void howOld(){
    	System.out.println(age);
    }
}
  • 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 다른 사람들도 사용할 필요가 있는 변수들만 getter를 이용해서 드러냈다.
  • 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter
// 하나의 게시물을 표현하기 위한 JavaBeans
public class Article {
	private int seq;		// 글 번호
	private String subject;	// 글 제목
	private String content;	// 글 내용
	private String writer;	// 작성자
	private int hit;		// 조회수
	private String regDate;	// 작성일자
    
    // 파라미터가 있는 생성자
    public Article(int seq, String subject, String content, 
    				String writer, int hit, String regDate) {
    	this.seq = seq;
        this.subject = subject;
        this.content = content;
        this.writer = writer;
        this.hit = hit;
        this.regDate = regDate;
    }
    
    
    // getter, setter 추가
    public int getSeq() {
		return seq;
	}

	public void setSeq(int seq) {
		this.seq = seq;
	}
    
    public String getSubject() {
    	return subject;
    }
    
    public void setSubject(String subject) {
    	this.subject = subject;
    }
    
    public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public int getHit() {
		return hit;
	}

	public void setHit(int hit) {
		this.hit = hit;
	}

	public String getRegDate() {
		return regDate;
	}

	public void setRegDate(String regDate) {
		this.regDate = regDate;
	}
}

// main 메서드를 포함하고 있는 클레스에서
// 객체 생성 및 항목들 출력
public class Main03 {
	public static void main(String[] args) {
    	Article art = new Article(1, "테스트 게시물", 
				"첫번째 게시물", "JAVA학생", 0, "2022-03-17");
        
        System.out.println( art.getSeq() );
        System.out.println( art.getSubject() );
		System.out.println( art.getContent() );
		System.out.println( art.getWriter() );
		System.out.println( art.getHit() );
		System.out.println( art.getRegDate() );
    }
}
result

1
테스트 게시물
첫번째 게시물
JAVA학생
0
2022-03-17
profile
개린이의 개발 고수되기 작전!

0개의 댓글