13일차 수업에 이어서 UML 다이어그램을 진행한다.
이를 보고 클래스 작성하기를 과제로 주셨다.
Member class
package net.kh.member.model;
public 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() {
}
//getter + setter
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberPwd() {
return memberPwd;
}
public void setMemberPwd(String memberPwd) {
this.memberPwd = memberPwd;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Run 클래스
package net.kh.member.run;
import net.kh.member.model.Member;
public class Run {
public static void main(String[] args) {
Member m = new Member();
m.setMemberId("chun");
m.setMemberName("춘딩");
m.setMemberPwd("chun1234");
m.setAge(26);
m.setGender('여');
m.setPhone("01012341234");
m.setEmail("chun@email.com");
String memberInfo = "아이디 : " + m.getMemberId()+"\n"
+ "이름 : " + m.getMemberName()+"\n"
+ "이름 : " + m.getMemberPwd()+"\n"
+ "나이 : " + m.getAge()+"\n"
+ "성별 : " + m.getGender()+"\n"
+"전화번호 : "+ m.getPhone()+"\n"
+"이메일 : " + m.getEmail();
System.out.println(memberInfo);
}
}
실행결과
star UML 활용하기
Tool - Extension Manager
껐다가 재실행
Tools - Java - Reverse Code
코드 불러내기
이 모양이 class 이다.
다음과같이 일일히 작성하지 않아도 사용이 가능하다.
변수
1. 전역변수
1) 멤버변수 : 객체마다 존재하는 변수
2) 클래스 변수 : static 키워드를 가짐. 클래스마다 존재. 공유목적
일반적으로 public static final로 상수로써 공유한다. (읽기 전용)
2. 지역변수
메소드 안에서만 유효. 메소드 영역에서 선언
변수별 생명주기
1. 클래스 변수 (static) : 프로그램에서 클래스 최초사용 ~ 프로그램 종료시 까지
2. 멤버 변수 (heap) : 객체 생성 시 ~ 객체 소멸 시 까지
3. 지역 변수 (stack) : 메소드 호출 시 ~ 메소드 리턴 시 까지
public class IPhone13 {
// 클래스변수(static)
public static final int WIDTH = 10;
public static final int HEIGHT = 20;
// 멤버변수(non-static)
private String name;
private String number;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setNumber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
/**
* 홍길동(01012341234)가 신사임당(01067896789)에게 전화를 건다....
* @param other
*/
public void callTo(IPhone13 other) {
System.out.printf("%s(%s)가 %s(%s)에게 전화를 건다....",
this.name, this.number, other.name, other.number);
}
}
public class IPhone13Main {
public static void main(String[] args) {
// static자원은 클래스 이용직전에 메모리적재가 끝난다.
IPhone13 hongPhone = new IPhone13();
hongPhone.setName("홍길동");
hongPhone.setNumber("01012341234");
// static자원(필드/메소드)은 클래스이름으로 접근해야한다. 객체 참조변수가 아니라.
// IPhone13.WIDTH = 11;
System.out.println(IPhone13.WIDTH);
System.out.println("이름 : " + hongPhone.getName());
System.out.println("전화번호 : " + hongPhone.getNumber());
IPhone13 sinPhone = new IPhone13();
sinPhone.setName("신사임당");
sinPhone.setNumber("01067896789");
System.out.println("이름 : " + sinPhone.getName());
System.out.println("전화번호 : " + sinPhone.getNumber());
//전화걸기
hongPhone.callTo(sinPhone); // 홍길동(01012341234)가 신사임당(01067896789)에게 전화를 건다....
}
}
IPhone13 메모리 파악하기
가장먼저 static 자원이 static에 적재된다.
main이 실행된다.
hongPhone이 만들어짐 -> heap영역에 name과 number 필드가 설정됨.
call stack에 setName 실행프레임이 만들어지고, this라는 공간은 선언하지 않았어도 존재한다.
this내의 숨은 참조변수에는 주소 0x777 이 존재한다. (임의로 지어낸 주소임) .
call stack의 name에 홍길동이 존재하므로 heap 영역에 주소 0x777인 name에도 null값에서 홍길동으로 바뀐다.
setNumber도 마찬가지로 실행되어 01012341234로 바뀐다.
멤버변수의 초기화순서(객체생성)
1. 타입별 초기값 (우선순위 4)
2. 명시한 초기값 (우선순위 3)
3. 초기화 블럭에서 대입한 값 (우선순위 2)
4. 생성자에서 대입한 값 (우선순위 1)
public class Sample{
//1. 타입별 초기값
int a;
//2. 명시한 초기값
int a=100;
//3. 초기화 블럭에서 대입한 값
//method안에서만 println같은 함수 사용가능. 초기화블록에서도 사용이 가능하다.
{
a=200;
System.out.println();
}
//4.생성자메소드 : 객체가 생성될 때 필드값 초기화를 목적으로 호출되는 메소드
public Sample(){
System.out.println("생성자 전 : a = " + a );//a=200
a=300;
System.out.println("생성자 후 : a= " + a); //a=300
}
}
클래스변수의 초기화순서(클래스최초사용시)
1. 타입별 초기값 (우선순위 3)
2. 명시한 초기값 (우선순위 2)
3. 초기화 블럭에서 대입한 값 (우선순위 1) <- 복잡한 값세팅이 있다면 여기서!
클래스의 경우 생성자가 필요 X
그래서 복잡한 세팅이 있다면 클래스 변수에서 초기화 한다.
static 초기화
public class Sample{
//1. 타입별 초기값 (int=0,double =0.0...)
static b; //결과 0
//2. 명시한 초기값
static int b=99; //결과 99
//3. 초기화 블럭에서 대입한 값
static {
System.out.println("static 초기화블럭 전 : b =" +b); //99
b=999;
System.out.println("static 초기화블럭 후 : b =" +b); //999
}
}
자바 접근제한자
public : 다른 패키지에서도 접근 가능
protected : 같은 패키지에서만 접근 가능 + 자식클래스는 다른 패키지에서 접근 가능
default(package) : 같은 패키지에서만 접근 가능
private : 같은 클래스 내부에서만 접근 가능
멤버변수와 클래스변수 초기화를 이해하는게 어려웠다 ㅠㅠ
점점 어려워지는 중