JAVA - 게시판 저장 객체

Luna·2022년 12월 1일
0

JAVA

목록 보기
7/32

처음에 수업시간에 이 코드를 작성 했을 때는 게시판 저장 객체를 만드려면 이 모든걸 다 구현 해야 되는 줄 알았고, 그냥 선생님이 시킨대로 따라 치기만 했다. 메인 메서드를 만들기 전에 VO 메서드를 먼저 냅다 만들기 시작해서 조금 헷갈린 부분도 있었다. 하지만 블로그를 정리하면서 코드를 하나하나 리뷰해보니 게시판에 넣을 데이터의 변수를 선언하고 그 값을 불러오는 여러가지 방법이 있다는 것을 깨달았다. 아직 메모리에 올라가는 순서나 실행되는 순서는 헷갈리기 때문에 중간 중간에 System.out.println() 메서드를 실행해서 어느 코드가 먼저 메모리에 올라가고 실행되는지 파악하는것도 중요 할 것 같다.

  • 코드 예제를 통해 메모리에 올라가서 실행되는 순서를 파악 해 보기
  • 생성한 객체를 호출하거나 변경하는 여러가지 방법을 구현 해 보기


BoardMain 클래스

  • 실제로 실행되는 메인 클래스

전체 코드

public class BoardMain {
	public static void main(String[] args) {
    	Board.vo = new BoardVo();
        vo.setTitle("setter를 이용한 게시판");
        System.out.pintln(vo);
        
        BoardVo vo1 = new BoardVo();
        System.out.println(vo1);
        
        BoardVo vo2 = new BoardVo(2,"제목", "내용");
        System.out.println(vo2);
        
        BoardVo vo3 = new BoardVo(3, "제목1", "내용1", 'A', true);
        System.out.println(vo3);

BoardVo 클래스

  • 만들 게시판의 객체를 저장하는 클래스

전체 코드

public class BoardVo {

	private long no;
	private String title = "제목";
	private String content;
	private char grade;
	private boolean update;   
	static private int serialNo; 
	
	static {
		serialNo = 1;
	}

	{ 
		no = 1;
		serialNo++;
	}
	
	public BoardVo() {
		super();
		content = "내용";
	}
	
	public BoardVo(long no, String title, String content) {
		this.no = no;
		this.title = title;
		this.content = content;
	}
	
	public BoardVo(long no, String title, String content, char grade, boolean update) {
		this(no, title, content);
		this.grade = grade;
		this.update = update;
	}
	
	public BoardVo(String title, String content) {
		this(0, title, content, ' ', false);
	}
	
	public long getNo() {
		return no;
	}	
	public void setNo(long no) {
		if (no>0) this.no = no;
		else System.out.println("no 데이터(" + no + ")는 오류가 있습니다. 음수 데이터는 사용할 수 없습니다.");
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public char getGrade() {
		return grade;
	}
	public void setGrade(char grade) {
		this.grade = grade;
	}
	public String isUpdate() { 	
		return (update)?"수정이 되었다.":"수정이 되지 않았다.";
	}
	public void setUpdate(boolean update) {
		this.update = update;
	}
    
	@Override
	public String toString() {
		return "BoardVo [no = " + no + ", title = " + title + ", content = " + content
        + ", grade = '" + grade+ "' , update = " + update + ", serialNo = " + serialNo + "]";
	}
}


BoardVo Class

객체 변수 선언

인스턴스 변수

	private long no;
	private String title = "제목";
	private String content;
	private char grade;
	private boolean update;
  • 속성(attribute = field = item) 또는 멤버 변수 선언
  • 저장할 항목의 변수를 다른 클래스에서 접근하지 못하게 private으로 선언.
  • static을 붙이지 않았기 때문에 인스턴스 변수이다. new를 통해서 객체를 생성하면 메모리에 올라간다.
  • 값을 넣지 않더라도 초기화는 기본값으로 세팅이 된다.
    숫자 : 0, String : null, char : 공백문자, boolean : false
  • 메서드 안의 변수들은 생성하면서 생기지 않고 메서드를 호출해서 실행하는 중에 생기기 때문에 반드시 초기값을 세팅 해야 한다.

클래스 변수

static private int serialNo;
  • 이 변수는 static이 붙었기 때문에 클래스 변수이다.
  • BoardVo.serialNo라고 호출하며, new를 통한 객체 생성 없이도 자동으로 메인 메모리에 올라간다.



초기화 블록

static 초기화 블록

static {
		serialNo = 1;
	   }
  • static초기화 블록은 static 변수의 값을 초기화 시키기 위해 사용함
  • 초기화 블록은 안에서 이미 값이 정해져있을 때 사용한다.
  • 초기화 블록을 선언하고 안에 no = 1; 과 같은 코드를 넣는다면 no 변수는 static변수가 아니기 때문에 에러가 뜬다.

기본 초기화 블록

{
    no = 1;
    serialNo++;
}
  • static변수가 아닌 변수의 값을 초기화 시키기 위해서는 static이 없는 초기화 블록을 사용하면 되는데, static변수의 값도 변경이 가능하다.

생성자

  • 생성자 : 외부에서 초기값을 전당해서 세팅하고 싶을 때 만든다.

기본 생성자

public BoardVo() {
	super();
    content = "내용";
}
  • 전달되는 값이 없는 기본 생성자를 생성하면 초기화 블록 대신 사용이 가능하다. 기본 생성자는 매개변수(parameter)가 없다.
  • 리턴 타입이 없어서 주소가 리턴된다.
  • super() : 현재 이 클래스는 작성자가 따로 상속받게 한 클래스가 없다. 그래서 자동으로 object클래스를 상속 받고 있는데, 부모 클래스(object)를 호출할 때 쓰는 명령어이다. super()라고 호출하지 않아도 자동으로 들어간다.

오버로딩

  • 오버로딩(Overloading)
    : 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것
public BoardVo(long no, String title, String content) {
	this.no = no;
    this.title = title;
    this.content = content;
}
  • 처음 데이터를 만들 때 번호, 제목, 내용은 꼭 나오게 생성하고 싶을 때 사용
  • 사용 방법 예시 : new BoardVo(1, "제목", "내용");
  • 리턴 타입이 없어서 주소값이 리턴된다.

public BoardVo(long no, String title, String content, char grade, boolean update) {
	this (no, title, content);
	this.grade = grade;
	this.update = update;
}
  • 위에 이미 번호, 제목 내용의 값을 갖는 생성자를 만들었기 때문에 (public BoardVo(long no, String title, String content) 코드 중복을 막기 위해 번호, 제목, 내용 부분은 위의 생성자를 호출해서 사용한다.
  • thie(no, title, conten); 를 먼저 호출하고 나머지 값을 저장.
  • 리턴 타입이 없어서 주소값이 리턴된다.

public BoardVo (String title, String content)
	this(0, title, content)
  • 전달 하려는 생성자 중 일부만 있다면, 전달되는 값은 그대로 전달하고 나머지는 기본값으로 세팅한다.
  • this(no, title, content) 코드를 활용해서 no 값만 기본값인 0으로 설정 하고 나머지는 그대로 값을 전달 한다.
  • 만약 this(no, title, content, grade, boolean) 코드를 활용한다면, thie(0, title, content, ' ', false) 라고 전달하면 된다.

Getter와 Setter 메서드

참조 블로그 -> getter와 setter를 사용하는 이유

  • Getter, Setter 메서드를 사용하는 이유는 객체의 무결성을 보장하기 위해 사용함.
  • Getter, Setter를 이용해서 데이터를 생성 및 접근하게 되면 들어오는 값을 바로 저장하는게 아니라 한 번 검증하고 처리 할 수 있기 때문에 무결성이 지켜짐. 예를 들어 외부에서 키, 나이, 몸무게 같은 필드에 접근 한다고 가정 했을 때, 이러한 값의 특성들은 음수가 나올 수 없다는 것이다. 그런데 접근 할 때 0보다 낮은 값을 주면 객체의 무결성이 깨지므로 이를 방지하기 위해 사용한다.
  • 무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것을 말함.
  • Getter : 폰 필드의 값을 숨긴 채 내부에서 가공된 값을 꺼낼 수 있다.
  • Setter : 필드를 private로 만들어 외부의 접근을 제한 한 후,
    setter를 사용해 전달받은 값을 내부에서 가공해 필들에 넣어 줄 수 있다.

Getter

public long getNo() {
	return no;
}
pubilc String getTitle() {
	return title;
}
public String getContent() {
	return content;
}
public char getGrade() {
	return grade;
}
public String isUpdate() {
	return(update)?"수정이되었다.":"수정이 되지 않았다";
}
  • Getter 메서드 같은 경우는 값을 불러오는 메서드이다.
  • boolean 타입은 원래 public boolean isUpdate() 라고 써야 하는데 위의 코드에서는 리턴하는 값이 String 타입이기 때문에 return 타입을 String 타입으로 변경 해 주었다.

Setter

public void setNo(long no) {
	if (no > 0) {
    	this.no = no;
    } else {
    	System.out.println("no 데이터에는 음수값이 올 수 없습니다.");
    }
}
public void setTitle(String title) {
	this.title = title;
}
public void setContent(String content) {
	this.content = content;
}
public void setGrade(char grade) {
	this.grade = grade;
}
public void setUpdate(boolean update) {
	this.update = update;
}
  • 위에서 언급 했던 것 처럼 Setter 메서드를 통해 값을 변경 할 경우 no의 값을 음수로 지정할 수 없게 조건을 걸어 줄 수 있다. 이러면 데이터의 무결성을 지킬 수 있다.

toString()

  • 객체를 출력할 때 자동으로 호출 당해서 문자열로 만들어주는 메서드
@Override
public String toString() {
	return "BoardVo [no = " + no + ", title = " + title + ", content = " + content
        + ", grade = '" + grade+ "' , update = " + update + ", serialNo = " + serialNo + "]";
  • 데이터의 값이 잘 들어갔는지, 혹은 잘 변경 됐는지 확인하기 위한 메서드이다. toString() 메서드를 선언하려면 상위 클래스인 object 클래스에 선언 됫 것과 똑같이 선언 되었는지 확인 해야 한다. 이 때 사용하는게 annotation 인데, 맨 위에 @override 라고 선언 해 주면 된다.
  • 어노테이션(Annotation)
    : 자바에서의 어노테이션은 사전적 의미로는 주석이라는 뜻을 가지고 있다.
    어노테이션은 메타데이터의 일종이다. 보통 골뱅이(@)를 앞에 붙여서 사용하고
    @Override @Deprecated @SupperssWarnings @SafeVarags 등을 사용한다.
    위에서 사용한 @Override는 메소드를 오버라이드 하겠다는 의미로 메소드의 선언 앞에 붙여준다. 만약 상속받은 부모 클래스 또는 구현해야 할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 발생한다.

참조 블로그 : 자바 어노테이션 사용법 및 예제


BoardMain 클래스

    	Board.vo = new BoardVo();
        vo.setTitle("setter를 이용한 게시판");
        System.out.pintln(vo);
  • Setter 메소드를 이용해서 값을 변경하고 불러오기

        BoardVo vo1 = new BoardVo();
        System.out.println(vo1);
  • 매개변수가 없는 기본 생성자를 이용해서 값을 불러오기

        BoardVo vo2 = new BoardVo(2,"제목", "내용");
        System.out.println(vo2);
  • 매개변수가 (no, title, content) 인 생성자를 이용해서 값을 불러오기

        BoardVo vo3 = new BoardVo(3, "제목1", "내용1", 'A', true);
        System.out.println(vo3);
  • 매개변수가 (no, title, content, grade, update) 인 생성자를 이용하기

0개의 댓글