1. 추상 클래스
package method;
import java.util.ArrayList;
public class ab1 extends ab1_box1{
public static void main(String[] args) {
abox1();
}
}
//abstract : 추상클래스
abstract class ab2_box1{ //추상 클래스 선언
String userid; //필드에 변수를 선언시 public, protected를 이용
//private 으로 변수를 선언시 abstract class 안에서만 작동이 됨
public void aaa() {};
public String bbb() {return null;};
public Integer ccc() {return 0;};
}
class ab2_class extends ab2_box1{
@Override //@ : 어노테이션
public void aaa() {
// TODO Auto-generated method stub
super.aaa();
}
@Override
public String bbb() {
// TODO Auto-generated method stub
return super.bbb();
}
@Override
public Integer ccc() {
// TODO Auto-generated method stub
return super.ccc();
}
public ArrayList<String> ddd(){
return null;
}
}
//extends는 상속 클래스를 한개만 상속받을 수 있음
class ab3_class extends ab2_box1{
@Override
public void aaa() {
this.userid = "aaa";
System.out.println(userid);
super.aaa(); //문법 안썼으면 슈퍼 안써도됨
}
}
- abstract : 추상 클래스
- extends : 외부 클래스를 상속 받아서 처리
- 오버로드, 오버로딩(Overload, Overloading) : 상속 메소드외에 개발자 별도로 메소드를 구성
- 오버라이드, 오버리딩(override,overriding) : 상속 메소드
- 필드에 변수를 선언시 public, protected를 이용
추상 클래스 파일
package method;
import java.util.*;
abstract class ab_box {
String userid = null; // 추상 클래스 전역변수
Scanner sc = new Scanner(System.in); // Scanner
ArrayList<String> all = null;
final int level = 1; // 상수로 선언하여 값을 변경 못하며 해당 변수를 로드 ex)회사전화번호
// 추상클래스를 상속받는 동시에 실행되는 메소드이며 별도의 @이 출력되지 않음
public ab_box() { // 즉시실행메소드 getter setter같은 경우
this.userid = "hong";
System.out.println(this.userid);
};
public void ab_method1() {
int data[] = { 10, 20, 30, 40};
int f = 0;
for (f = 0; f < data.length; f++) {
System.out.println(data[f]);
}
}
public void ab_method1(String uid) {
};
public void ab_method1(int uid) {
};
}
추상클래스파일의 클래스 사용
package method;
import java.util.ArrayList;
public class ab2 {
public static void main(String[] args) {
ab2_box ab = new ab2_box();
ab.ab_method1();
ab.ab_method1(12345);
}
}
//ab_box 추상클래스 로드
class ab2_box extends ab_box{
//즉시실행은 선언안해도 바로 실행됨
public ab2_box() { //별도 메소드를 선언하여 클래스 로드시 즉시실행 가능
String email = "hong@nate.com";
System.out.println(email);
}
@Override
public void ab_method1() { //super : 추상클래스 안의 메소드에 코드를 작성한 경우 그 코드를 로드할때 사용
super.ab_method1(); //추상클래스 메소드안에있는 코드도 쓰고싶을때 슈퍼를 쓰고 그 메소드안에 아무것도없을땐 굳이 안써도 됨
}
@Override
public void ab_method1(int uid) {
if(uid == 12345) { //인증번호가 동일한 조건일 경우
this.all = new ArrayList<String>(); //추상클래스 필드에 선언된 클래스 배열을 실행
while(true) {
System.out.println("상품명을 입력하세요(exit 입력시 종료) : ");
String product = this.sc.nextLine();
if(!product.equals("exit")) {
this.all.add(product);
}else {
break;
}
System.out.println(this.all); //사용자가 입력한 상품명 리스트 출력
}
}else { //인증번호가 다른 경우
System.out.println("인증번호가 틀렸습니다");
}
}
}
- super :추상클래스 안의 메소드에 코드를 작성한 경우 그 코드를 로드할때 사용
추상클래스파일
package method;
import java.text.SimpleDateFormat;
import java.util.*;
abstract class ab_box2 {
public String today() {
//local PC의 시간을 출력하는 라이브러리
Date day = new Date(); //이건 서버시간이 아니라 윈도우 시간
// SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd");
// SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sf2 = new SimpleDateFormat("E",Locale.ENGLISH);
System.out.println(sf.format(day));
System.out.println(sf2.format(day));
return sf.format(day);
}
//추상 클래스에 사용된 추상 return 메소드 (단,중괄호,리턴 안씀 소괄호로 끝남)
//abstract 메소드는 상속받을 경우 무조건 오버라이드 해야하는 메소드
public abstract String product();
public void basket() {}
public abstract void userbasket();
}
- 날짜
- Date, SimpleDateFormat
- yyyy : 년도 / MM : 월 / dd : 일
- HH(hh) : 시간 24(12) / mm : 분 / ss : 초
- hh기준 a : 오전/오후
- E : 요일 / Locale : 언어셋변경할때 사용하는 라이브러리
- Date, SimpleDateFormat
추상클래스파일의 클래스 사용
package method;
public class ab3 {
public static void main(String[] args) {
ab3_box ab = new ab3_box();
ab.today();
}
}
class ab3_box extends ab_box2{
@Override
public String product() {
String date = this.today();
System.out.println(date);
return null;
}
@Override
public void userbasket() {
// TODO Auto-generated method stub
}
}
- 추상클래스의 추상메소드는 무 조 건 로드해야한다 로드안하면 빨간줄!!
2. 자료형과 시간
package method;
public class string_etc {
public static void main(String[] args) {
String a = "a1234";
String b = "a1234";
String c = new String("a1234"); //여기에 .intern때리면 true나옴 근데 d랑은 안됨
String d = new String("a1234");
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a == c); // false
System.out.println(a.equals(c));
System.out.println(c == d); // false
System.out.println(c.equals(d));
String user = "홍길동";
String welcome = "님 환영합니다.";
String msg = user + welcome;
StringBuffer sb = new StringBuffer();
sb.append("강감찬");
sb.append("님 포인트는 1500입니다.");
System.out.println(sb);
StringBuilder sb2 = new StringBuilder();
sb2.append("LG 냉장고");
sb2.append("- 350000");
System.out.println(sb2);
//Unboxing => 기본타입, Long->long long->long
long t = System.currentTimeMillis();
long sum = 0L;
int f;
for(f=1;f<1000000;f++) {
sum += f;
}
System.out.println("실행시간 : "+(System.currentTimeMillis()-t));
//long을 Long에 넣음 -> 오래걸림
//Boxing => 기본 타입을 클래스 형태 타입으로 변경 long->Long int->Integer
long t2 = System.currentTimeMillis();
Long sum2 = 0L;
int f2;
for(f2=1;f2<1000000;f2++) {
sum2 += f2;
}
System.out.println("실행시간 : "+(System.currentTimeMillis()-t2));
/* 박싱 */
Integer num = new Integer(100);
/* 언박싱 */
String w = "100";
int no = Integer.parseInt(w);
no = num.valueOf(w); //parseInt보다 더느림
//클래스변수, 박싱상태 많이쓰면 느려짐
//Integer 필드에 올려놓을때 null 해두면 오류 많이 발생 주의
Integer aa = null;
int zz = 10;
System.out.println(aa+zz);
}
}
- String 주의점
- 같은 자료형 또는 자료형 클래스라고 해도 new가 붙으면 인스턴스 영역(메모리)로 변경되므로 비교하는 상황이 달라질 수 있음
- 쓰레드를 이용한 문자열 핸들링
- StringBuffer : 버퍼이용 / 멀티쓰레드에서 빠름 -> 모바일
- StringBuilder : 빌더이용 / 단일쓰레드에서 빠름 -> 웹
- 박싱
- unboxing : 기본타입
- Long->long long->long
- boxing
- 기본 타입을 클래스 형태 타입으로 변경 -> 오래걸림
- long->Long int->Integer
- 기본 타입을 클래스 형태 타입으로 변경 -> 오래걸림
- unboxing : 기본타입
- Integer 주의점
- 필드에 올려놓을때 null로 초기화해두면 연산시 nullpoint 오류 발생!