220105 calendar, wrapper, Inheritance
*과제 확인
1.
나: 앞자리 뒷자리 각각 Check 클래스 메소드로 넘겨 문자열 하나하나 분리해서 숫자로 변환해 배열에 저장하고 계산함
답: +연산자로 앞자리 뒷자리 붙여서 한꺼번에 13자리를 Check 클래스 메소드로 넘기고! 굳이 배열에 저장할 것 없이 total에 바로 Integer.parseInt(num.substring(i,i+1))로 연산시킴
-> 굳이 배열을 선언해서 메모리를 사용하기보다 변환된 값을 바로 계산해 total에 집어넣는게 효율적이라는 것. 어차피 나중에 필요한 값은 total이기 때문에 중간에 스쳐지나가는 과정 하나하나에 메모리 영역을 할당시킬 필요는 없다
즉, 어제 필드에 배열을 넣으면 값이 들어가니마니 하는건 의미없는 행동이었다는 거지... 이부분 답변 듣지 못했음 ㅠㅠ
-> 어제 int형 배열은 13자리 한번에 받으면 된다는 생각을 했었는데, String형 배열도 13자리 한번에 받으면 좀더 쉽게 해결할 수 있었을 것. 좀더 넓게 생각해보자
2.
나: 주민번호 타당성 검사할 때 2~9곱하고 다시 2~5곱할 수 있게 for문을 두 번 돌렸음
답: 그냥 int 배열로 2,3,4,5,6,7,8,9,2,3,4,5 넣고 for문으로 배열값 곱하게 함... 이래도 되는군
3.
나: 굳이 앞자리 뒷자리 글자수를 Check 메소드로 구했는데 코드 한줄밖에 안되는건 그냥 메인에 써도 될듯? 이건 클래스랑 메소드 부분 복습할 겸 쓴거니까 괜찮아
+)좀더 정밀한 검사 (입력받은 값이 숫자인지 문자인지..) -> 자바엔 isNaN 같은게 없어서 -> 정규표현식 사용
특정 단어가 존재하는지 확인할 때는 contains() 같은 걸 이용할 수 있겠음
어제에 이어서
* 날짜/시간 클래스
1. Calendar 클래스(import java.util.Calendar)
- new 연산자로 객체 생성하면 오류 남 (생성자 사용 시)
방법
1. 자식클래스 이용해 객체 생성 후 형변환
ex.
Calendar c1=new GregorianCalendar();
//클래스명과 생성자명이 다름 -> 왼쪽이 부모 클래스, 오른쪽 자식 클래스 -> 레퍼런스 형변환 : 업캐스팅
2. getInstance() 이용해 캘린더 객체 생성 (이게 좀더 많이 쓰임)
ex.
Calendar c2=Calendar.getInstance();
//static method->클래스명.메소드로 바로 접근 가능 -> getInstance()로 접근해 Calendar 클래스 객체를 생성
+)
int y=c2.get(Calendar.YEAR);
//그냥 바로 YEAR 빼오지 말고, Calendar 클래스의 get 메소드의 매개변수로 집어넣어야 현재 연도 구할 수 있음
int m=c2.get(Calendar.MONTH);
//MONTH의 범위가 0~11로 잡히므로 출력 시 +1을 해줘야함
DATE: 일
HOUR: 12시
HOUR_OF_DAY: 24시
MINUTR: 분
AM_PM: 0 오전, 1 오후
등등
* 자료형변환
1. 기본자료형 변환
2. Wrapper 클래스 이용한 변환 (기본자료형 <-> 참조형)
~Integer 클래스~ (얘가 중요!)
: 기본 생성자가 존재하지 않으므로 무조건 매개변수 하나를 넣어줘야 함
( Integer in=new Integer(); ---> 오류! )
- ★★String형을 int형으로 변환★★
Integer.parseInt(String s);
- 10진수를 변환
Integer.toBinaryString(int i); // 2진수로
Integer.toOctalString(int i); // 8진수로
Integer.toHexString(int i); // 16진수로
-박싱, 언박싱
박싱boxing: heap메모리를 박스라고 생각했을 때, stack에 저장되어있는 값을 heap메모리에 복사하는 것
언박싱: heap메모리 값을 stack으로 불러오는 것
ex)
Integer num=new Integer("20"); //박싱
int n=num.intValue(); //언박싱
+)
자동 박싱: Wrapper 클래스 타입에 기본값이 대입될 경우 발생
Integer obj=100; // JDK 1.6 이후부터 지원
자동 언박싱: 기본 타입에 Wrapper 객체가 대입될 경우 발생
int value1=obj; //위의 100이 자동으로 언박싱됨
----> 메소드 매개변수가 최상위 클래스(object)인 경우 주로 사용!
(자식 객체의 값을 부모 객체로 할당시키고자 할 때라든가)
위에서 말한 메소드 매개변수가 object인 경우
* 박싱+업캐스팅
Object value=new Integer(3);
-> 부모클래스 Object에 자식클래스 Integer로 객체를 생성해 값을 할당시킴
-> 박싱(heap메모리에 저장)+업캐스팅(부모 클래스로 변환)
-> 가능한 조건: 두 클래스 사이에 상속관계가 형성되어 있는 상태여야 함
Object value=3;
-> 오토박싱+업캐스팅
* 언박싱+다운캐스팅
int n=((Integer)(obj01.getValue())).intValue();
-> 부모클래스 Object에 할당된 값을 Integer 클래스로 변환해 변수로 값을 할당시킴
-> 박싱(stack메모리로 저장)+다운캐스팅(자식 클래스로 변환)
int n=(Integer)(obj01.getValue());
-> 오토언박싱+다운캐스팅
참고) String으로 바꿀 땐 오토불가 -> String형 값은 heap에만 저장되거든-> String != Wrapper
++) 다운캐스팅할때 자식클래스 자료형으로 강제형변환! 반드시 시켜줘야함 (작->큰으로 바꾸는거니까)
3. 레퍼런스 형변환
상속 후에 공부
***상속Inheritance***
: 자식(하위, 파생, sub) 클래스가 부모(상위, super) 클래스의 멤버를 물려받는 것
상속 대상-> 부모의 필드, 메소드 (생성자는 받을 수 없음)
하위에서 상위 클래스를 선택해 상속받을 수 있다
-> 물려받는다= 부모클래스에서 상속받은 멤버는 따로 선언하거나 불러올 것 없이 내것처럼 바로 쓸 수 있다
하위클래스는 상위클래스에서 받은 멤버와 하위클래스에서 추가한 멤버를 모두 사용할 수 있음
GUI 다룰 때 많이 사용함
ex) java.awt , javax.swing , javafx 등
1. API 2. JSP(Model2)
* 상속의 효과
- 부모 클래스 멤버를 재사용 -> 빠른 개발 가능
- 코드 중복 줄임
- 유지, 보수 편리
- 객체 다형성
* 제한
- 부모 클래스의 private 접근제어자 갖는 필드, 메소드 제외
- 부모 클래스가 다른 패키지에 존재할 경우 default 접근제어자 갖는 필드, 메소드 제외
* extends
: 자식 클래스가 상속할 부모 클래스를 지정하는 키워드
부모 클래스: class A {
자식 클래스: class B {
상속 시 class B extends A {
(단, 자바는 단일 상속이므로 부모클래스 나열 불가 -> 딱 하나만 가능!)
class C extends A, B { <- 다중 상속 불가능