Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

23.03.13 / 하나의 패키지 서로 다른 클래스 (필드에 바로 접근) 본문

Back - end/JAVA

23.03.13 / 하나의 패키지 서로 다른 클래스 (필드에 바로 접근)

낫쏘링 2023. 3. 13. 09:05
728x90

[ 하나의 클래스에서 다른 클래스의 데이터와 메서드를 불러오는 방법 ]

- 회원 관리 클래스를 통해 새로운 객체를 생성하면 새로운 주소1이 생성되고, 주소1 내에 데이터 영역과 메소드 영역이 생성된다.
- 회원 관리 클래스를 통해 새로운 객체를 생성하면 새로운 주소2가 생성되고, 주소2 내에 데이터 영역과 메소드 영역이 생성된다.
- 회원 관리 클래스에 아이디와 패스워드와 이름에 대한 정보를 받을 준비가 되어있다.
- 주소1 내의 데이터 영역에 아이디를 id001로 설정하고 싶으면 주소1을 찾아가서 데이터 영역을 찾아가서 아이디 값을 id001로 설정한다.
- 주소1의 데이터 영역의 아이디 값 id001을 불러오고 싶으면 주소1을 찾아가서 데이터 영역을 찾아가서 아이디 값을 불러와 응용할 수 있다.

 

[ 더 자세하게 들어가 보자 ]

1. 메인 메서드가 포함 된 Main class와 메인 메서드가 없는 User 클래스를 생성한다.

2. Main 클래스 내에서 User class type으로 u01 객체 참조 변수를 선언한다.   [ User u01 =  ] 
   (u01객체 참조 변수가 처음에 생성되면 초기 주소값은 null이다. - 주소가 없다는 뜻)

3. new User();를 통해 객체를 생성한다. (user()생성자 메서드 new)
   생성자 : 객체를 생성하는 순간에 실행되는 메소드 [ new User() ]  (결국 메소드의 일종)
   필드(전역변수)에 있는 데이터를 객체를 생성하는 순간에 초기화 시켜준다. 
   default 생성자는 매개변수 없이 메소드만 필요할 때 생략 가능하다.
   new User("ID001") 에서 매개변수 ID001 없이 new User() 메소드만 사용할 때

4. 객체가 생성되면 새로운 주소(회원 주소1)가 생성된다. -> data 영역 & method 영역도 생성된다.
   (Main 클래스 내에서 User 클래스의 객체를 생성 했기 때문에 User 클래스에 주소1과 data 영역과 method 영역이 생성됨)

package kr.or.ksmart.a;

public class User {
	//★ 전역변수(global variable) = 필드(field)
	//유사용어 : 프로퍼티(property) / 프로퍼티 = 전역변수 아님!
	//클래스 블록 안 & 메서드 블록 밖에 선언 된 변수
	String uid;
	String upw;
	String uphone;
	char ugender;
	int uage;
	String ulevel;
	//중괄호 블록 밖에 선언된 변수 : 안에서 사용 가능
	//중괄호 블록 안에 선언된 변수 : 밖에서 사용 불가능
	
	//지역변수(local variable) : 메서드 내에서 사용 됨.
	//호출되면 살아 있다가 휘발 된다.
	
	//default 생성자 메서드 선언 : 새로운 객체를 생성한다.
	//default 생성자 메서드만 필요한 경우 생략 가능
	public User() {
		
	}
}



5. 생성된 주소 값을 주소 값이 null이었던 u01 객체 참조 변수에 할당한다.  [ User u01 =  new User(); ]
   (이제 u01 객체 참조 변수의 주소 값은 회원 주소1이 된다.) 

User u01 = new User();

 

6. Main 클래스에서 u01 객체 참조 변수에 할당된 주소1(User 클래스를 통해 생성된 객체)을 찾아가서 data영역의 초기 값 형태인 전역변수에 값을 설정한다.

u01.uid = "id001";
u01.upw = "pw001";
u01.uphone = "010-0001";
u01.ugender = '남';
u01.uage = 20;
u01.ulevel = "구매자";

 

7. Main 클래스에서 u01 객체 참조 변수에 할당된 주소1(User 클래스를 통해 생성된 객체)을 찾아가서 data영역의 값을 불러온다.

uPrint(u01);

 

 

즉, User 클래스의 소스 코드에 접근하는 것이 아니고
    User 클래스를 통해 생성된 객체(주소)에 접근하는 것이다.



[ 키워드 정리 ]

- 키워드와 각 키워드들이 작용하고 동작하는 원리를 제대로 이해하지 못하면 아무것도 할 수 없다. 제대로 이해하자!

클래스 데이터 타입 / 객체 참조 변수 / 선언 / 할당 / 호출 / 객체 주소(주소 값) / 생성자 메서드
데이터 영역 , 메서드 영역 / 전역변수(필드, 글로벌변수)
겟팅(꺼내온다, 불러온다) / 셋팅(입력한다, 대입한다)

User - class data type
u01 - 객체 참조 변수

int - primitive data type
u01 - 매개 변수

reference 타입의 클래스 타입으로 선언할 경우
- User data type으로 u01 객체 참조 변수를 선언하고...
만약 클래스 타입이 아니라 primitive 타입인 int 였다면..
- int data type으로 u01 변수를 선언하고...

 

[ 전체 코드를 보고 생각해 보자 ]

package kr.or.ksmart.a;

public class AA01 {
	//실행은(Ctrl+F11) main 메서드 포함 된 클래스에서 한다. 
	public static void main(String[] args) {
		// User라는 클래스 타입
		User u01 = new User();  //★어떻게 설명할 수 있을까?
		User u02 = new User();
		System.out.println(u01+"< - u01"); 
		//u01의 주소값 출력
		//u01에는 주소값이 할당되어있기 때문에 u01을 출력하면 주소값이 나온다.
		//User getu = kr.or.ksmart.a.User@1c4af82c;
		
		//id001 pw001 010-0001 남 20 구매자		
		u01.uid = "id001";  //★어떻게 설명할 수 있을까?
		u01.upw = "pw001";
		u01.uphone = "010-0001";
		u01.ugender = '남';
		u01.uage = 20;
		u01.ulevel = "구매자";
		uPrint(u01);
		
				
		//id002 pw002 010-0002 여 30 판매자
		u02.uid = "id002";
		u02.upw = "pw002";
		u02.uphone = "010-0002";
		u02.ugender = '여';
		u02.uage = 30;
		u02.ulevel = "판매자";
		uPrint(u02);
		
		Goods g01 = new Goods();
		//p001	id002	노트북	2000000	1000000	SW개발용
		g01.pcode = "p001";
		g01.uid = u02.uid;  //★어떻게 설명할 수 있을까?
		g01.pname = "노트북";
		g01.pjungsang = 2000000;
		g01.phalin = 1000000;
		g01.psangse = "SW개발용";
		gPrint(g01); //★어떻게 설명할 수 있을까?
		
		Order o01 = new Order();
		//o001	p001	id001	3	2000000	6000000	금암동
		o01.ocode = "o001";
		o01.pcode = g01.pcode;
		o01.uid = u02.uid;
		o01.ocount = 3;
		o01.oprice = 2000000;
		o01.ototal = o01.ocount * o01.oprice;   //★어떻게 설명할 수 있을까?
		o01.oaddress = "금암동";
		oPrint(o01);
					
		
	}
	public static void oPrint(Order geto) {
		System.out.println("--- 주문 출력 시작 ---");
		System.out.println("주문코드 : "+geto.ocode);
		System.out.println("상품코드 : "+geto.pcode);
		System.out.println("구매자아이디 : "+geto.uid);
		System.out.println("주문수량 : "+geto.ocount);
		System.out.println("주문단가 : "+geto.oprice);
		System.out.println("주문합계 : "+geto.ototal);
		System.out.println("배송주소 : "+geto.oaddress);
		System.out.println("--- 주문 출력 끝 ---");
	}
	
	public static void gPrint(Goods getg) {
		System.out.println("--- 상품 출력 시작 ---");
		System.out.println("상품코드 : "+getg.pcode);
		System.out.println("판매자아이디 : "+getg.uid);
		System.out.println("상품이름 : "+getg.pname);
		System.out.println("정상가격 : "+getg.pjungsang);
		System.out.println("할인가격 : "+getg.phalin);
		System.out.println("상세설명 : "+getg.psangse);
		System.out.println("--- 상품 출력 끝 ---");
	}
	
	//getu 객체 참조 변수 - 주소 값 : 주소1
	//getu의 위치는 그냥 매개변수지만 객체 참조 변수의 역할을 한다.
	public static void uPrint(User getu) {
		System.out.println("--- 회원 출력 시작 ---");
		System.out.println("아이디 : "+getu.uid);
		System.out.println("비번 : "+getu.upw);
		System.out.println("휴대폰 : "+getu.uphone);
		System.out.println("성별 : "+getu.ugender);
		System.out.println("나이 : "+getu.uage);
		System.out.println("권한 : "+getu.ulevel);
		System.out.println("--- 회원 출력 끝 ---");
	}

}

 

package kr.or.ksmart.a;

public class User {
	//★ 전역변수(global variable) = 필드(field)
	String uid;
	String upw;
	String uphone;
	char ugender;
	int uage;
	String ulevel;
		
	//default 생성자 메서드 선언 : 새로운 객체를 생성한다.
	//default 생성자 메서드만 필요한 경우 생략 가능
	public User() {
		
	}
}

 

package kr.or.ksmart.a;

public class Goods {
	String pcode;
	String uid;
	String pname;
	int pjungsang;
	int phalin;
	String psangse;

}

 

★ User u01 = new User(); 에 대한 설명

User 클래스 데이터 타입으로 객체 참조 변수 u01을 선언한다.
User() 생성자 메서드를 호출하면 새로운 객체가 생성된다.
객체가 생성되면 주소도 생성되고 그 안에 데이터 영역과 메서드 영역이 존재한다.
생성된 주소를 객체 참조 변수 u01에 할당한다.

 

★ u01.uid = "id001"; 에 대한 설명

객체 참조 변수 u01에 할당 된 주소 값으로 찾아가서 데이터 영역에 있는 전역변수/필드 중 uid 필드에 id001 값을 셋팅(대입,입력)한다.

 

★ g01.uid = u02.uid; 에 대한 설명

u02 객체 참조 변수에 할당된 주소 값인 User클래스를 통해 생성된 새로운 객체 즉, 회원 주소2를 찾아가서
data 영역의 uid 필드(전역변수)에 담긴 값인 "id002"를 겟팅(꺼내온다)한다.
g01 객체 참조 변수에 할당된 주소 값인 Goods클래스를 통해 생성된 새로운 객체 즉, 상품 주소1을 찾아가서
data 영역의 uid 필드(적연변수)에 u02 객체 참조 변수에 불러온 값인 "id002"를 셋팅(대입/입력) 한다.


1. User 클래스를 통해 새로운 객체를 생성 한다.
    User  클래스를 통해 생성된 객체(인스턴스)
    새로운 주소값 : 회원 주소2
    data 영역
    String uid = null;    - > String uid = "id002";  겟팅
    String upw = null;
    String uphone = null;
    char ugender = '';
    int uage = 0;
    String ulevel = null;


2. Goods 클래스를 통해 새로운 객체를 생성 한다.
    Goods 클래스를 통해 생성된 객체(인스턴스)
    새로운 주소값 : 상품 주소1
    data 영역
    String pcode = null;
    String uid = null;  -> String uid = "id002";  셋팅
    String pname = null;
    int pjungsang = 0;
    int phalin = 0;
    String psangse = null;

 

★ gPrint(g01); 에 대한 설명

uPrint 메서드를 선언한다. 클래스 데이터 타입은 User 매개변수는 getu
객체 참조 변수 g01에 할당된 주소 값을 gPrint 메서드의 매개변수 getu에 대입해서 gPrint 메서드를 호출한다.
(getu는 매개변수지만 주소 값을 받는다는 점에서 객체 참조 변수의 역할을 한다.)


1. gPrint(g01);

2. public static void uPrint(User getu) {
        System.out.println("--- 회원 출력 시작 ---");
       System.out.println("아이디 : "+getu.uid);
       System.out.println("비번 : "+getu.upw);
       System.out.println("휴대폰 : "+getu.uphone);
       System.out.println("성별 : "+getu.ugender);
       System.out.println("나이 : "+getu.uage);
       System.out.println("권한 : "+getu.ulevel);
       System.out.println("--- 회원 출력 끝 ---");
   }

 

o01.ototal = o01.ocount * o01.oprice; 에 대한 설명

불러오거나 입력할 때 두 번 이상 불러오거나 입력할 때 주소 값에 한 번 만 찾아가서 한꺼번에 불러오거나 입력하는 것이 아니라 불러오거나 입력할 때 마다 주소 값으로 찾아가서 데이터 영역에서 전역변수의 값을 불러오거나 입력하는 것이다.
 = > o01 객체 참조 변수에 할당 된 주소를 찾아가서 데이터 영역의 ocount 전역변수의 값을 불러온다.
       o01 객체 참조 변수에 할당 된 주소를 또 ! 찾아가서 데이터 영역의 oprice 전역변수의 값을 불러온다.
       o01 객체 참조 변수에 할당 된 주소를 또또!! 찾아가서 데이터 영역의 ototal 전역변수의 값을 입력한다.

 

★ 전역변수(Global variable) = 필드(field)

유사용어 : 프로퍼티(property) / 프로퍼티 = 전역변수 아님!
- 클래스 블록 안 & 메서드 블록 밖에 선언 된 변수
- 중괄호 블록 밖에 선언된 변수 : 안에서 사용 가능
- 중괄호 블록 안에 선언된 변수 : 밖에서 사용 불가능

지역변수(local variable) : 메서드 내에서 사용 됨. / 호출되면 살아 있다가 휘발 된다.

otherclass.war
0.01MB

 

 

 

728x90