-
객체지향, 클래스, 메소드, 인스턴스 기초프로그래밍/JAVA 자바 2021. 7. 14.반응형
package ex0713; public class Ex04_class { public static void main(String[] args) { // Bank 클래스의 객체 생성 Bank ob; // 객체 선언(참조 변수, 레퍼런스 변수) ob = new Bank(); // 객체의 메모리 할당 //Bank() : 생성자임 객체의 초기화를 담당함 //객체 선언 및 메모리 할당 Bank ob2 = new Bank(); ob.name = "홍길동"; ob.money = 1000; System.out.println(ob.name + ":" + ob.money); System.out.println(ob2.name + ":" + ob2.money); } }
여기선 클래스가 Bank는 아니다 원래대로면 main 클래스가 맞다.
아예 맨 밑에 괄호 밑에다가 class Bank를 만들어야 한다.
그냥 인스턴스를 생성하는 예를 한번 보기 위함이다.
보통 Bank ob2 = new Bank(); 이렇게 한줄에 끝내버린다.
package ex0713; public class Ex05_class { public static void main(String[] args) { int x; //일반 변수 x=50; System.out.println(x); Test2 t1; //객체선언 t1 = new Test2(); //메모리 할당 // new 생성자(); System.out.println(t1.a); System.out.println(t1.b); System.out.println(t1.name); t1.name = "dasdasasd"; //필드에 값 넣어줌 t1.a=50; t1.write(); // 메소드 호출 Test2 t2 = new Test2(); //객체 생성과 메모리 할당 동시 t2.write(); } } //클래스의 기본 구조 = 필드 + 메소드 + 생성자 class Test2{ //필드 선언(인스턴스 변수) // 필드는 초기화 하지 않으면 객체가 생성되는 시점에 객체는 null, 숫자는 0으로 초기화가 된다. String name; int a; int b=10; //메소드 선언(인스턴스 메소드) public void write() { System.out.println(name + ":" + a + ":" + b); } }
여기선 제대로 맨 밑에 class 를 만들어줬다.
String name
int a
int b
는 전부 인스턴스 변수(객체 변수)
클래스의 필드(field)이다.
static 붙은건 클래스 변수
그리고 밑에 void 부분이 메소드(함수)이다.
void가 붙은건 동작을 하는 행위 return값을 생략 할 수있는 놈들에게 붙인다.
클래스의 기본 구조는 아래와 같다.
package ex0713; public class Ex06_class { public static void main(String[] args) { // 일반변수(지역변수) int x=10; System.out.println(x); // 클래스 변수 = 객체가 생성되지 않아도 언제나 접근 가능 // 클래스 변수는 객체 생성과 상관없이 하나의 메모리만 할당받고, 클래스가 메모리에서 사라질때 메모리가 해제됨. // 클래스명.클래스변수 <<형식 System.out.println(Test3.c); //인스턴스 변수는 객체가 메모리에 할당이 된 이후에 접근 가능 // 객체명.인스턴스 변수 << 형식 Test3 ob = new Test3(); // 메모리 할당 System.out.println(ob.a); //0 //System.out.println(ob.b); //private 필드는 외부 클래스에서 접근 불가능 ob.write();//직접적으로 접근 안되니까 클래스Test3내부에서 private 변수를 쓰고있는 write 메소드를 호출하면 됨. } } class Test3 { // 필드-인스턴스 변수 : 객체를 생성해야 접근할 수 있는 변수 int a; // 디폴트 : 동일한 패키지에서는 접근할 수 있다. private int b=10; // private : 해당 클래스에서만 접근할 수 있다. //필드 - 클래스 변수 : 객체 생성과 상관없이 접근할 수 있다. //클래스가 메모리에 로딩되는 순간 메모리 할당 public static int c=20; // public : 어디에서나 접근할 수 있다. public void write() { System.out.println(a+":"+b+c); } }
private 변수는 해당 클래스에서만 사용 가능
public 변수는 어디에서나 접근이 가능하다
앞에 아무것도 안붙이고 그냥 int a; 이런식으로 하는건 같은 패키지에서는 접근이 가능함
private < 디폴트 < public 순서로 접근이 쉽다.
package ex0713; public class Ex07_class { public static void main(String[] args) { // 클래스 변수 접근 System.out.println(Test4.c); // 클래스 메소드 접근 Test4.write(); //인스턴스 변수, 인스턴스 메소드는 객체 생성 후 접근 // 인스턴스 변수는 생성된 객체마다 만들어짐(메모리가 할당됨) Test4 tt = new Test4(); tt.a=50; tt.print(); Test4 tt2 = new Test4(); tt2.print(); } } class Test4{ //인스턴스 변수 /객체가 생성되어야 사용 가능 int a; private int b = 10; //클래스 변수 /객체생성과 관계없이 사용 가능 public static int c = 100; //인스턴스 메소드 /객체가 생성되어야 사용 가능 public void print() { System.out.println(a+":"+b+":"+c); } //클래스 메소드 /객체 생성과 상관없이 사용 가능 public static void write() { //System.out.println(a); //컴파일 오류 = 클래스 메소드에서는 인스턴스 변수나 인스턴스 메소드 호출 불가 System.out.println(c); } }
중요한 점은
인스턴스 변수는 인스턴스(객체)가 생성 되어야 사용이 가능하다.
인스턴스 만드는 방법은
class명이 Hello 일때
Hello asdknasd = new Hello();
이러면 asdknasd 이라는 Hello에 속하는 인스턴스가 새로 생겨난 것이다.
asdknasd << 이 부분은 원하는 인스턴스 이름 입력
그러나 public 붙은 놈들은 클래스 변수이기 때문에 객체가 없어도 사용이 가능하다.
public static int c = 0;
ex) Hello.c 를 출력
package ex0713; public class Ex08_class { public static void main(String[] args) { // 레퍼런스(참조)변수 선언 및 메모리 할당 // 참조변수(메모리를 할당 받은) 만큼 필드는 메모리를 할당 받는다. Test5 ob1 = new Test5(); Test5 ob2 = new Test5(); ob1.b=100; System.out.println(ob1.a+":"+ob1.b); System.out.println(ob2.a+":"+ob2.b); System.out.println(ob1 == ob2); // 동일한 주소인지 확인 Test5 t1 = new Test5(); Test5 t2 = t1; t2.b=200; System.out.println(t1.a+":"+t1.b); System.out.println(t2.a+":"+t2.b); System.out.println(t1 == t2); // 동일한 주소인지 확인 } } class Test5{ int a=10; int b; public void print() { System.out.println(a+":"+b); } }
참조 변수 구분할줄 알아야 하는데
보통 새로 Test5 ob1 = new Test5(); 처럼 선언을 한다면 참조 변수가 아니지만
만약 Test5 t2; 이렇게 객체를 선언만 하고 메모리 할당을 안한 상태에서
Test5 t2= t1; 이렇게 t1을 넣어 버리면 이때부터는 t2와 t1은 서로 변수를 참조하게 된다.
즉 초기에 인스턴스 변수 b에다 0을 넣었고
t1.b = 100; 이렇게 b에다 100을 넣고
t2.b를 출력하면 0이 아니라 100이 나온다는 것이다.
package ex0713; public class Ex09_class { public static void main(String[] args) { Test6 t1 = new Test6(); Test6 t2 = new Test6(); t2.b=100; t1.print(); t2.print(); t2=t1; t1.print(); t2.print(); } } class Test6 { int a=10; int b; public void print() { System.out.println(a+":"+b); } }
메소드 선언
package ex0713; public class Ex10_method { public static void main(String[] args) { Test7 tt = new Test7(); int result; result = tt.sum(10); System.out.println(result); result = tt.sum(100); System.out.println(result); boolean b; b = tt.isEven(13); System.out.println(b); char c; c = tt.upper('a'); System.out.println(c); c = tt.upper('9'); System.out.println(c); result = tt.max(5,10); System.out.println(result); tt.gugudan(7); double g = tt.grade(85); System.out.println(g); } } class Test7{ //접근제어 리턴 타입 메소드명(매개변수타입 매개변수명) public int sum(int n) { int s=0; //지역변수 /메소드 안에서만 사용 가능 for(int i=1; i<=n; i++) { s+=i; } return s; //반환값을 가지고 호출한 곳 으로 돌아감 } //짝수인지 판별하는 메소드 /짝수 홀수 둘다 판별 xx 기능은 하나만 public boolean isEven(int n) { return n%2==0; } //매개변수로 주어진 문자가 소문자이면 대문자로 변환하는 메소드 public char upper(char c) { return c>='a' && c<='z' ? (char)(c-32) : c; } //매개변수로 주어진 문자가 소문자이면 true 그렇지 않으면 false public boolean isLower(char c) { return c>='a'&& c<='z'; } //두개의 매개변수로 주어진 정수 중 큰 수를 반환하는 메소드 public int max(int x, int y) { //매개변수 따로 선언 return x>y ? x: y; } //매개변수로 주어진 구구단 출력 /단 주어진 매개변수가 1~9사이의 수가 아니면 아무것도 출력하지 않음 public void gugudan(int dan) { //동작이 있는건 void for(int i=1; i<=9; i++) { System.out.printf("%d * %d = %2d",dan,i,dan*i); System.out.println(); } return; // void 에서는 생략 가능하다. } //점수에 따른 평점 계산 // 95~100=4.5 / 90~94=4.0 ... 59~0 = 0.0 public double grade(int score) { double s = 0.0; if(score>=95) s = 4.5; else if(score>=90) s = 4.0; else if(score>=85) s = 3.5; else if(score>=80) s = 3.0; else if(score>=75) s = 2.5; else if(score>=70) s = 2.0; else if(score>=65) s = 1.5; else if(score>=60) s = 0.0; else s=0.0; return s; } }
아래 class 부분에서 여러 메소드들을 선언하고
위에 main 에서 실행을 하는 모습이다.
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
참조 변수/ 생성자 / 생성자의 this문 / getter setter (0) 2021.07.16 메소드 정리, 재귀호출 (0) 2021.07.15 배열 마무리 / 명령행인수 (0) 2021.07.13 배열, 2차원 배열, 여러가지 정렬 방법 (0) 2021.07.13 break문 / continue문 / 배열 (0) 2021.07.11