프로그램 ( 예 : 쇼핑몰 프로그램) 을 생성하려면 설계도가 있어야 한다.
자바(java)라는 프로그램 개발 언어를 사용하여 만드는 설계도를 "클래스" 라고 부른다.(물체를 만들기위한 부품의 설계도이며, 이 부품들이 모여서 제품이 된다.)
== 설계도를 기반으로 메모리에 공간확보함.
자바가 파일을 읽을때는 src폴더가 아닌 bin폴더에 있는 class파일(컴파일 완료된)으로 읽는다.
메모리에 올라가야만 쓸수 있음>
1.디스크에 저장되었던 Member.class가 있다
=> Ram에 이 클래스를 올려서 메모리상의 공간 할당함.(주소)
메인 메소드에서 클래스를 읽어오면서 메모리에 공간 할당하여 띄우는 것임
메모리에 올라간 상태 = 객체화(인스턴스화) 되었다
public class Member {
java.lang.String id; //String은 문자열을 뜻하는 클래스이다.
//id라는 변수(변하는 수)에는 문자열이 들어온다는 뜻임.
String pwd; //비밀번호
String name; //이름
String email;
static String address;
id,pwd,name,email은 instance(인스턴스) 변수라고 부른다.
instance(인스턴스)변수 -- instance(인스턴스)변수를 다른말로 non static 변수라고도 한다.
instance(인스턴스)는 클래스가 메모리(RAM)에 올라가서 실제 사용가능한 객체로 되어진 상태를 말하는 것이다. (인스턴스(객체) 를 만들 때마다 새로 만들어진다(메모리에 올라간다))
=> 힙 영역에 보관되어서 GC 발생전에는 생존해 있다.
instance(인스턴스)변수는 서로 다른 instance 끼리 공유하지 못하고 각자 자기의 instance 내에서만 사용하는 것이다.
static(스태틱) 변수는 동일한 클래스로 생성되어진 서로 다른 instance 들 끼리 공유하는 변수이다. (메서드 영역에 저장되어 jvm 종료시까지 제일 길게 살아있음. 실행 시점에 static 메모리 할당됨)
static 변수는 각 인스턴스로 접근해서 사용하는 게 아닌, 클래스로 접근해서 바로 사용되는 것이 권장된다. (클래스명.변수명으로 접근, 자신 클래스 안에선 생략 가능)
public class Member_main {
public static void main(String[] args) {
Member lssMbr = new Member(); //Member 클래스 파일을 읽어다가 메모리에 로딩시키겠다는 말이다.
//Member 클래스를 인스턴스(==객체)화 했다라고 부른다.
System.out.println(lssMbr);
//my.day01.Member@73a28541
//패키지명.클래스명@메모리(RAM) 상에 올라온 주소값
//IssMbr을 사용해서 my.day01.Member@73a28541를 제어가능
//그래서 IssMbr 은 메모리 참조변수라고 부른다.
System.out.println(eom_mbr); // my.day01.Member@6f75e721
//패키지명.클래스명@메모리(RAM) 상에 올라온 주소값
//eom_mbr을 사용해서 my.day01.Member@6f75e721를 제어가능
//그래서 eom_mbr은 메모리 참조변수라고 부른다.
System.out.println("\n--------------------");
lssMbr.id = "leesss"; // = 은 같다가 아니라 대입해준다는 뜻
lssMbr.pwd = "abcd";
lssMbr.name = "이순신";
lssMbr.email = "leess@naver.com";
lssMbr.address = "서울시 강남구";//이렇게 사용해도 되지만, static 변수는 아래와 같이 클래스명.변수명으로 사용할 것을 권장함.
Member.address = "서울시 강남구";//공통
System.out.println("== lssMbr이라는 인스턴스(객체)에 저장된 필드 값 출력하기 1번째 ==");
System.out.println("1. 아이디: " + lssMbr.id + "\n" +
"2. 비밀번호: " + lssMbr.pwd + "\n" +
"3. 성명: " + lssMbr.name + "\n" +
"4. 이메일: " + lssMbr.email + "\n" +
"5. 주소 : " + lssMbr.address);
System.out.println("\n--------------------");
eom_mbr.id = "eomjh"; // = 은 같다가 아니라 대입해준다는 뜻
eom_mbr.pwd = "qwer1234";
eom_mbr.name = "엄정화";
eom_mbr.email = "eojh@naver.com";
System.out.println("== eom_mbr이라는 인스턴스(객체)에 저장된 필드 값 출력하기 1번째 ==");
System.out.println("1. 아이디: " + eom_mbr.id + "\n" +
"2. 비밀번호: " + eom_mbr.pwd + "\n" +
"3. 성명: " + eom_mbr.name + "\n" +
"4. 이메일: " + eom_mbr.email + "\n" +
"5. 주소(비추):" + eom_mbr.address + "\n" +
"6. 주소(권장):" + Member.address + "\n");
}
}
-콘솔 프로그램의 실행은 main()메소드에서 실행한다.
-Member 클래스를 Member_main 클래스에서 객체화하여 끌어다 썼다고 볼 수 있다.
Member member = new Member(); -> Member 붕어빵 틀로 member라는 붕어빵을 만듬.
객체 생성시(인스턴스화) 메모리에 이 member의 메모리를 할당하면서 주소값을 저장하고ㅡ member변수에 주소값이 담아져 있어서 이 주소값으로 접근한다.(참조값을 "복사"한다.)
같은 붕어빵 틀로 만들어도 다른 붕어빵이다 (주소값이 다름, 설계도만 끌어다 쓰는 것이다.)
-클래스는 속성(데이터, 멤버 변수) 와 기능(메서드) 를 정의 가능하며,
객체는 자신의 메서드를 통해 자신의 멤버 변수에 접근이 가능하다.
타 패키지에 있는 클래스를 가지고 오려면 import 해야 하고, 아닌 경우 import 하지 않아도 됨.
참고사항: 단어와 단어사이를 연결지을때 대소문자로 구분짓는 것을 카멜 기법이라고 한다.
ex> 1ssmbr이라고 사용하지 않고 1ssMbr라고 씀