-
접근 제한자 / 성적 처리 코드프로그래밍/JAVA 자바 2021. 7. 19.반응형
초기화 블럭
package ex0716; public class Ex01 { public static void main(String[] args) { // 초기화 블럭 Test1 tt; // =======클래스가 로딩되는 시점========== (처음 객체 생성하거나 처음 클래스변수, 클래스 메소드를 사용하는 시점) //System.out.println(Test1.y); 클래스 로딩됨 tt = new Test1(); tt.print(); Test1 ob = new Test1(); ob.print(); } } /* * 클래스가 로딩될때 한번 실행 * 1) 클래스 변수 메모리 할당 - 메소드 영역 * 2) 클래스 변수를 디폴트 값으로 초기화 * 3) 초기화 변수 수식 실행 * 4) static 초기화 블록 실행 * * * 객체를 생성할때 마다 실행 * 1) new Test1(); 객체를 위한 메모리 할당(인스턴스 변수의 메모리 할당) : a,b,c,d * 2) 모든 인스턴스 변수는 디폴트 값으로 초기화 : a,b,c,d, = 0 * 3) 초기화 수식으로 초기화 (존재하는 경우에만) : b = 1 * 4) 초기화 블럭 실행 (존재하는 경우에만) * 5) 생성자 몸체 실행 * (1) 생성자 몸체에서 첫번째 문장의 super([인수]); 또는 this([인수]) 실행 * (2) 생성자 몸체 실행 */ class Test1 { private int a; private int b = 1; private int c; private int d; public static int x = 10; public static int y; static { // static 변수의 초기화 // 한번만 실행 : 클래스가 로딩될때 y = 20; System.out.println("static 초기화 블럭"); } //d=5; //에러 실행문이 올수없다 { //인스턴스 초기화 블럭(객체가 생성될 때마다 실행) //초기화 블럭에서 할 수있는건 생성자에서 가능 d = 5; System.out.println("초기화 블럭"); } public Test1() { c = 10; System.out.println("생성자 ..."); } public void print() { System.out.println(a + ":" + b + ":" + c + ":" + d); } }
static {
}
형상의 초기화와
일반 초기화
{
}
final 비 접근 제한자
보통 선언과 동시에 초기화
package ex0716; public class Ex02 { public static void main(String[] args) { // final System.out.println(Test2.a); Test2.a = 20; System.out.println(Test2.a); } } class Test2 { public static int a=10; public final static double PI=3.141592; //한번만 초기화가 되며 값을 변경 못한다. //이런식으로도 가능 public final static int x; static { x=5; } final int b = 10; // final 인스턴스 변수(잘 사용 안함) final int c; public Test2() { //x=10; final static 변수는 생성자 단계에서 초기화 불가 c = 10; // final 인스턴스 변수는 생성자에서 초기화 가능 } public void sub() { // c = 5; // 컴오류 일반 메소드에서 변경 불가능 } }
singleton 패턴 (싱글턴)
package ex0716; public class Ex03 { public static void main(String[] args) { //Test3 tt = new Test3(); 생성자가 private라서 생성 불가 Test3 ob1 = Test3.getInstance(); Test3 ob2 = Test3.getInstance(); System.out.println(ob1); System.out.println(ob2); System.out.println(ob1 == ob2); } } // singleton 패턴 //검색 해보기 = 하나의 객체만 생성 class Test3 { private static Test3 tt = null; private int a = 10; // 생성자가 pirvate이면 외부에서 객체 생성 불가능 private Test3() { System.out.println("private 생성자.."); } public static Test3 getInstance() { if(tt == null) { tt = new Test3(); } return tt; } public void sub() { System.out.println(a+":"+a); } }
예를 들어 학교 클래스와 학생 클래스가 있다고 하면
학생은 여러명이니까 상관 없지만 학교는 하나이기 때문에 싱글턴 패턴을 사용해야 한다.
School sc; 로 인스턴스 선언하고
if 문활용
School getInstance() {
if(sc == null) //sc 안에 아무런 값이 없다면 그 뜻은 곧 아직 객체가 생성된 적이 없다는 얘기sc = new School(); // 아무것도 없으면 인스턴스 생성
}
return sc; // 만약 인스턴스가 존재 한다면 존재하는 인스턴스를 반환
이렇게 되면 하나의 인스턴스만이 사용이 된다.
날짜 시간 표시 메소드
package ex0716; import java.util.Calendar; public class Ex04 { public static void main(String[] args) { // 날짜 시간 표시 메소드 Calendar cal = Calendar.getInstance(); System.out.printf("%tF %tA %tT \n", cal, cal, cal); MyCalendar mc = new MyCalendar(); System.out.println(mc.getDate()); } } class MyCalendar{ private int year; private int month; private int date; public MyCalendar() { Calendar cal = Calendar.getInstance(); // 오늘 컴퓨터 시스템 시간 및 날짜로 Calendar 객체 생성 year = cal.get(Calendar.YEAR); month = cal.get(Calendar.MONTH)+1; // cal.get(Calendar.MONTH) : 0~11 date = cal.get(Calendar.DATE); } public MyCalendar(int year, int month, int date) { this.year = year; this.month = month; this.date = date; } public String getDate() { String s = year + "年" + month + "月" + date + "日"; return s; } }
import java.util.Calendar; 로 import 해주고
Calendar cal = Calendar.getInstance(); 로 cal 이라는 객체 생성(오늘 컴퓨터 시스템 시간 및 날짜로 Calendar 객체 생성)
성적 처리 관련 프로그램
총 5개의 클래스가 있다.
App = 메인 클래스 프로그램을 실행시킬때 사용
User = 학생들 정보(데이터)가 저장 되는곳
UserResult = 최종 결과 담당 클래스
UserUI = UI 관련 클래스
UserVO = 학생들 이름 나이 함수 관련 클래스
App
package user1; public class App { public static void main(String[] args) { /* * UserUI ui = new UserUI(); * ui.menu(); 위아래 같은 소스임 */ new UserUI().menu(); //한줄로 표현한거 } }
인스턴스 생성 후 클래스 호출을 한줄로 표현 가능 하다.
new UserUI().menu();
User
package user1; public class User { private UserVO[] list; private int count; public User() { allocation(10); } private void allocation(int capacity) { UserVO[] temp = new UserVO[capacity]; if(list != null && count > 0) { System.arraycopy(list, 0, temp, 0, count); } list = temp; } public int append(UserVO vo) { if(count >= list.length) { allocation(list.length + 10); } list[count++]=vo; return count; } public int getCount() { return count; } public UserVO[] getList() { return list; } }
allocation으로 배열 꽉차면 늘려주는 역할
private 변수 get으로 리턴해주기
UserResult
package user1; public class UserResult { private User user; //만약 new를해서 새로 객체를 생성해버리면 기존의 데이터를 가져오는게아니라 그냥 새로 만드는거 // 인자가 있는 생성자만 존재 // 생성자를 이용하여 의존 관계 설정 public UserResult(User user) { this.user = user; } public void printAll() { UserVO[] list = user.getList(); System.out.println("이름\t나이\t결과"); System.out.println("---------------------------"); for(int i=0; i<user.getCount(); i++) { UserVO vo = list[i]; System.out.print(vo.getName()+"\t"); System.out.print(vo.getAge()+"\t"); System.out.println(vo.getAdult()); } } }
User내용 가져와서 출력
UserUI
package user1; import java.util.Scanner; // 객체의 의존관계 public class UserUI { private Scanner sc = new Scanner(System.in); private User user = new User(); private UserResult ur = new UserResult(user); public UserUI() { //new UserResult(user); //방법은 2개 } public void menu() { int ch; while(true) { do { System.out.print("\n 1.등록 2.출력 3.종료 => \n"); ch = sc.nextInt(); } while(ch<1 || ch>3); if(ch==3) return; switch(ch) { case 1 : input(); break; case 2 : print(); break; } } } public void input() { System.out.println("데이터 등록...\n"); UserVO vo = new UserVO(); System.out.print("이름 ?"); vo.setName(sc.next()); System.out.print("나이 ?"); vo.setAge(sc.nextInt()); user.append(vo); System.out.println("등록 완료...\n"); } public void print() { System.out.println("데이터 출력... \n"); ur.printAll(); } }
메인에서 불러오는 클래스
UI를 통해서 입력을 받음
UI를 통해서 데이터 등록, 출력을 받음
실제적으로 기능은 다른 클래스에 있음
UserVO
package user1; public class UserVO { 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 getAdult() { return age >= 19 ? "성인" : "미성년"; } }
필요한 학생 이름과 나이 함수
private로 되어있음
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
Calendar API / StringBuilder (0) 2021.07.21 자바의 기본 API 클래스 (String, 기본) (0) 2021.07.20 참조 변수/ 생성자 / 생성자의 this문 / getter setter (0) 2021.07.16 메소드 정리, 재귀호출 (0) 2021.07.15 객체지향, 클래스, 메소드, 인스턴스 기초 (0) 2021.07.14