처음에 수업시간에 이 코드를 작성 했을 때는 게시판 저장 객체를 만드려면 이 모든걸 다 구현 해야 되는 줄 알았고, 그냥 선생님이 시킨대로 따라 치기만 했다. 메인 메서드를 만들기 전에 VO 메서드를 먼저 냅다 만들기 시작해서 조금 헷갈린 부분도 있었다. 하지만 블로그를 정리하면서 코드를 하나하나 리뷰해보니 게시판에 넣을 데이터의 변수를 선언하고 그 값을 불러오는 여러가지 방법이 있다는 것을 깨달았다. 아직 메모리에 올라가는 순서나 실행되는 순서는 헷갈리기 때문에 중간 중간에
System.out.println()
메서드를 실행해서 어느 코드가 먼저 메모리에 올라가고 실행되는지 파악하는것도 중요 할 것 같다.
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);
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 + "]";
}
}
private long no;
private String title = "제목";
private String content;
private char grade;
private boolean update;
private
으로 선언.static
을 붙이지 않았기 때문에 인스턴스 변수이다. new
를 통해서 객체를 생성하면 메모리에 올라간다.static private int serialNo;
static
이 붙었기 때문에 클래스 변수이다.BoardVo.serialNo
라고 호출하며, new
를 통한 객체 생성 없이도 자동으로 메인 메모리에 올라간다.static {
serialNo = 1;
}
static
초기화 블록은 static
변수의 값을 초기화 시키기 위해 사용함no = 1;
과 같은 코드를 넣는다면 no
변수는 static
변수가 아니기 때문에 에러가 뜬다.{
no = 1;
serialNo++;
}
static
변수가 아닌 변수의 값을 초기화 시키기 위해서는 static
이 없는 초기화 블록을 사용하면 되는데, static
변수의 값도 변경이 가능하다.public BoardVo() {
super();
content = "내용";
}
super()
: 현재 이 클래스는 작성자가 따로 상속받게 한 클래스가 없다. 그래서 자동으로 object
클래스를 상속 받고 있는데, 부모 클래스(object
)를 호출할 때 쓰는 명령어이다. super()
라고 호출하지 않아도 자동으로 들어간다.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 : 필드를 private로 만들어 외부의 접근을 제한 한 후,
setter를 사용해 전달받은 값을 내부에서 가공해 필들에 넣어 줄 수 있다.
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
타입으로 변경 해 주었다.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;
}
no
의 값을 음수로 지정할 수 없게 조건을 걸어 줄 수 있다. 이러면 데이터의 무결성을 지킬 수 있다.@Override
public String toString() {
return "BoardVo [no = " + no + ", title = " + title + ", content = " + content
+ ", grade = '" + grade+ "' , update = " + update + ", serialNo = " + serialNo + "]";
toString()
메서드를 선언하려면 상위 클래스인 object
클래스에 선언 됫 것과 똑같이 선언 되었는지 확인 해야 한다. 이 때 사용하는게 annotation
인데, 맨 위에 @override
라고 선언 해 주면 된다.@Override
@Deprecated
@SupperssWarnings
@SafeVarags
등을 사용한다.@Override
는 메소드를 오버라이드 하겠다는 의미로 메소드의 선언 앞에 붙여준다. 만약 상속받은 부모 클래스 또는 구현해야 할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 발생한다.참조 블로그 : 자바 어노테이션 사용법 및 예제
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);
(no, title, content)
인 생성자를 이용해서 값을 불러오기 BoardVo vo3 = new BoardVo(3, "제목1", "내용1", 'A', true);
System.out.println(vo3);
(no, title, content, grade, update)
인 생성자를 이용하기