-
참조 변수/ 생성자 / 생성자의 this문 / getter setter프로그래밍/JAVA 자바 2021. 7. 16.반응형
참조 변수 활용
package ex0715; public class Ex01_sort { public static void main(String[] args) { // 참조 변수 활용 int[]a= {15,10,25,17,33,40}; print("source:" ,a); sort(a); print("sort:" ,a); } public static void print(String title, int[]num) { System.out.print(title); for(int n : num) { System.out.print(n+" "); } System.out.println(); } public static void sort(int[] num) { boolean b = true; int t; for(int i=1; b; i++) { b = false; for(int j=0; j<num.length-i; j++) { if(num[j] > num[j+1]) { t = num[j]; num[j] = num[j+1]; num[j+1] = t; b=true; } } } } }
생성자 기초
package ex0715; public class Ex02_constructor { public static void main(String[] args) { //생성자 기초 /* * 객체의 메모리 할당 : a 필드가 heap 영역에 메모리 할당을 받는다. * a 필드는 디폴트값(0) 으로 초기화가 됨. * 생성자 몸체를 실행하여 a필드는 10으로 초기화 된다. * 생성자 몸체는 객체가 생성될때 한번만 실행된다. 중요 * 생성자는 리턴 타입 주면 안돼 */ Test1 ob = new Test1(); //객체가 생성되고, 객체에 필요한 초기화 작업이 이루어짐 new다음이 생성자임 ob.print(); } } //생성자의 가장 큰 목적은 초기화 /* 생성자 클래스와 동일한 이름을 가지며 return 타입이 존재하지 않음 모든 클래스는 하나 이상의 생성자를 가진다. 생성자를 만들지 않으면 자바는 컴파일할때 아무코드도 없고 매개변수도 없는 디폴트 생성자를 만든다. 생성자는 new 연산자 다음에 호출하며 객체를 생성할때 초기화를 담당. 생성자는 일반 메소드처럼 호출할 수 없다. */ class Test1{ private int a; public Test1() { a = 10; System.out.println("생성자 ..."); } public void print() { System.out.println("a : " + a); } }
인자가 있는 생성자
package ex0715; public class Ex03_constructor { public static void main(String[] args) { //인자가 있는 생성자 //Test2 tt = new Test2(); // 이건 컴파일 오류 인자가 없기 때문에 (생성자 만들면서 인자 넣으라고 만들었음) Test2 tt = new Test2(10); tt.print(); } } class Test2{ private int a; public Test2(int n) { a = n; System.out.println("인자가 하나인 생성자 ..."); } public void print() { System.out.println("a : " + a); } }
생성자 중복으로 정의
package ex0715; public class Ex04_constructor { public static void main(String[] args) { // 생성자 중복으로 정의 Test4 t1 = new Test4(); //인자가 없음 t1.print(); Test4 t2 = new Test4(10); //인자가 한개 있음 t2.print(); } } // 생성자 중복 정의 class Test4 { private int a; public Test4() { System.out.println("인자 없는 생성자"); } public Test4(int n) { a = n; System.out.println("인자 있는 생성자"); } public void print(){ System.out.println("a : " + a); } }
한 클래스안에 여러개의 생성자를 생성 한모습
this문
생성자에서 this문을 써야하는 이유
package ex0715; public class Ex05_this { public static void main(String[] args) { // 생성자의 this문을 써야하는 이유 Test5 t = new Test5(); t.set(5); t.print(); } } class Test5 { // 인스턴스 변수는 해당 클래스의 모든 인스턴스 메소드에서 바로 접근 가능. private int a; private int b; public void set(int b) { // 지역변수(매개변수)와 필드변수 이름이 동일하면 지역변수가 우선 순위가 높다. a = 10; //필드 변수 값 변경 b = b + 100; // 인자가 b랑 이름이 똑같아서 그냥 매개 변수 값을 변경 시키는거임 } public void print() { System.out.println("a:"+a+", b:"+b); } }
set 메소드의 인자 이름이 메소드의 지역 변수 이름과 같을때 사용해준다.
this문 기초
package ex0715; public class Ex06_this { public static void main(String[] args) { // this문 기초 Test6 t = new Test6(); t.set(5); t.print(); //a:10, b:105 Test6 t2 = new Test6(); t2.set(3); t2.print(); //a:10, b:103 } } class Test6 { private int a; private int b; public void set(int b) { this.a = 10; // this = 호출한 객체(어떤 객체가 불렀는지) 만약 t객체가 불렀으면 this.a = t.a 와 같다. this.b = b + 100; //b는 set 매개변수와 이름이 겹치기 때문에 this를 써야함 생략 불가능 } public void print() { //System.out.println("a:"+a+", b:"+b); System.out.println("a:"+this.a+", b:"+this.b); // a는 겹치는 인자랑 이름이 겹치지 않아서 생각 가능한데 b는 불가능함 겹치니까 } }
this문을 써야하는 경우에는 출력할때도 this 꼭 붙여주기
getter Setter
package ex0715; public class Ex07_this { public static void main(String[] args) { // TODO Auto-generated method stub Test7 ob = new Test7(); //ob.age = 20; // private 변수는 외부에서 접근 불가능 ob.setName("홍길동"); ob.setAge(20); System.out.println(ob.getName() + "님은" + ob.result()); } } //getter setter 로 뽑아내기 class Test7 { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String result() { return age>=19 ? "성인" : "미성년"; } }
클래스 안 아무 곳에 클릭 해주고
shift + alt + s 해주고 r 누르고 다음엔 a 눌러서 만들어 주기
생성자에서 생성자 호출
package ex0715; public class Ex08_this { public static void main(String[] args) { // 생성자에서 생성자 호출 Test8 t = new Test8("나나나"); t.print(); } } class Test8{ private String name; private int age; public Test8() { System.out.println("인자없는 생성자"); } public Test8(String name) { this(name,5); //다른 생성자를 호출 생성자 선두에 단 한번만 가능 System.out.println("인자가 하나인 생성자"); } public Test8(String name, int age) { this.name = name; this.age = age; System.out.println("인자가 두개인 생성자"); } public void print() { System.out.println(name + ":" + age); } }
this 사용 불가할때
package ex0715; public class Ex09_this { public static void main(String[] args) { // this 사용 불가할때 Test9 t = new Test9(); t.set(50); t.print(); Test9.sub(10); System.out.println("Test9.b : "+ Test9.b); } } class Test9 { private int a; public static int b = 10; public void set(int a ) { this.a = a; } public void print() { System.out.println("a: "+a); } public static void sub(int b) { //this.b = b+10; 컴파일 오류 static 메소드에서는 this 사용 불가능 Test9.b = b + 10; //System.out.println(b); } }
성적 처리 코드 패키지
클래스를 조합해서 하나의 프로그램 만들어보기..
package score1; public class App { public static void main(String[] args) { // 메인 ScoreUI ui = new ScoreUI(); ui.menu(); } }
package score1; public class Score { //데이타 가지고있는 클래스 private ScoreV0[] list; //성적 리스트 private int count; //인원수 public Score() { //생성자 //list = new ScoreV0[5]; allocation(5); // 초기에 5개의 배열 생성 count = 0; } private void allocation(int capacity) { //배열 capacity개 추가하기 ScoreV0[] temp = new ScoreV0[capacity]; if(list != null && count > 0) { System.arraycopy(list, 0, temp, 0, count); } list = temp; } //배열에 ScoreV0 객체 추가 public int append(ScoreV0 vo) { if(count >= list.length) { allocation(list.length + 5); //배열이 꽉차면 5개씩 증가 } list[count++] = vo; return count; } public int getCount() { return count; } public ScoreV0[] listScroe() { return list; } //학번 조건에 만족하는 ScoreV0 객체 반환 public ScoreV0 readScore(String hak) { ScoreV0 vo = null; //자바에서 문자열을 비교할때는 ==이 아니라 반드시 equals()로 비교 for(int i = 0; i<count; i++) { ScoreV0 vo2 = list[i]; if(vo2.getHak().equals(hak)) { vo = vo2; break; } } return vo; } }
package score1; import java.util.Scanner; public class ScoreUI { public static void main(String[] args) { /* * 성적 처리 코드 * 1.등록 2.학번검색 3.리스트 4.수정 5.종료 => * * 성적 데이터 * 학번 / 이름 / 국,영,수 / 총점 * * UI * 데이터 : Scanner 객체, * 메소드 : 데이터 등록, 학번검색, 전체 리스트, 수정 */ } private Scanner sc = new Scanner(System.in); //스캐너 쓰일 일 많아서 필드에 두는게 낫다 // 필드에 있으면 close는 자동 클로즈 private Score ss = new Score(); public void menu() { int ch; while(true) { do { System.out.print("1.등록 2.학번검색 3.리스트 4.수정 5.종료 = > "); ch = sc.nextInt(); } while(ch<1 || ch>5); if(ch == 5) { //스캐너 클로즈를 쓰고 싶으면 이곳에다가 return; // 메뉴탈출 } switch(ch) { case 1 : input(); break; case 2 : findByHack(); break; case 3 : printAll(); break; case 4 : update(); break; } } } public void input() { System.out.println("\n 데이터 등록..."); ScoreV0 vo = new ScoreV0(); System.out.print("학번 ? "); vo.setHak(sc.next()); System.out.print("이름 ? "); vo.setName(sc.next()); System.out.print("국어 ? "); vo.setKor(sc.nextInt()); System.out.print("영어 ? "); vo.setEng(sc.nextInt()); System.out.print("수학 ? "); vo.setMat(sc.nextInt()); //vo 객체를 배열에 저장 int count = ss.append(vo); System.out.println("데이터 추가 완료, 총인원수 : \n" + count); } public void findByHack() { System.out.println("\n 학번 검색..."); String hak; System.out.print("검색할 학번 ? "); hak = sc.next(); ScoreV0 vo = ss.readScore(hak); if(vo == null) { System.out.println("등록된 학번이 아닙니다."); return; } System.out.print(vo.getHak()+"\t"); System.out.print(vo.getName()+"\t"); System.out.print(vo.getKor()+"\t"); System.out.print(vo.getEng()+"\t"); System.out.print(vo.getMat()+"\t"); System.out.print(vo.getTot()+"\t"); System.out.print(vo.getAve()); System.out.println(); } public void printAll() { System.out.println("\n 전체 리스트..."); ScoreV0[] list = ss.listScroe(); for(int i=0; i<ss.getCount(); i++) { ScoreV0 vo = list[i]; System.out.print(vo.getHak()+"\t"); System.out.print(vo.getName()+"\t"); System.out.print(vo.getKor()+"\t"); System.out.print(vo.getEng()+"\t"); System.out.print(vo.getMat()+"\t"); System.out.print(vo.getTot()+"\t"); System.out.print(vo.getAve()); } System.out.println(); } public void update() { System.out.println("\n 데이터 수정..."); String hak; System.out.print("수정할 학번 ? "); hak = sc.next(); ScoreV0 vo = ss.readScore(hak); if(vo == null) { System.out.println("등록된 자료가 아닙니다. \n"); return; } System.out.print("새로운 이름? "); vo.setName(sc.next()); System.out.print("국어 ? "); vo.setKor(sc.nextInt()); System.out.print("영어 ? "); vo.setEng(sc.nextInt()); System.out.print("수학 ? "); vo.setMat(sc.nextInt()); System.out.println("데이터 수정 완료...\n"); } }
package score1; //성적 데이터 public class ScoreV0 { // Value Object 성적표 n장 중에서 한장 private String hak; private String name; private int kor; private int eng; private int mat; private int tot; //외부에서 프라이빗 변수 접근하기 위해 getter setter 만들기 public String getHak() { return hak; } public void setHak(String hak) { this.hak = hak; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getKor() { return kor; } public void setKor(int kor) { this.kor = kor; } public int getEng() { return eng; } public void setEng(int eng) { this.eng = eng; } public int getMat() { return mat; } public void setMat(int mat) { this.mat = mat; } public int getTot() { tot = kor + eng + mat; //총점 반환을 위해 여기다 준다. return tot; } public int getAve() { return getTot() / 3; } /* 외부에서 총점을 건들면 안되니까 있으면 안된다. public void setTot(int tot) { this.tot = tot; } */ //외부에서 프라이빗 변수 접근하기 위해 getter setter 만들기 }
아직 나한텐 좀 어려워서 공부가 필요함 ㅜㅜ
주석 보면서 차근차근 다시 봐야겠음..
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
자바의 기본 API 클래스 (String, 기본) (0) 2021.07.20 접근 제한자 / 성적 처리 코드 (0) 2021.07.19 메소드 정리, 재귀호출 (0) 2021.07.15 객체지향, 클래스, 메소드, 인스턴스 기초 (0) 2021.07.14 배열 마무리 / 명령행인수 (0) 2021.07.13