국비/Java

2023.02.27 23일차 Java

춘핑이 2023. 2. 27. 17:39

23일차

5.참조타입

5.12 정규표현식

5.12.13 특수기호 숫자

Predefined character classes
숫자 : \d

String pattern1 = "[0-9]";
String pattern2 = "\\d"; // \d

System.out.println("0".matches(pattern1));
System.out.println("0".matches(pattern2));

System.out.println("19990112".matches("[0-9]{8}")); //true
System.out.println("19990112".matches("\\d{8}")); //true

// 전화번호
// 010으로 시작, - 하나있거나 없거나 숫자4개 -하나잇거나없거나 숫자4개
String number1 = "01099999999";
String number2 = "010-88888888";
String number3 = "010-7777-7777";

String pattern3 = "010-?\\d{4}-?\\d{4}";

System.out.println(number1.matches(pattern3)); //true
System.out.println(number2.matches(pattern3)); //true
System.out.println(number3.matches(pattern3)); //true

5.12.14 특수기호 공백문자

whitespace character 빈칸
[\t \n \xOB \r] : \s

String pattern1 = "\\s"; // \s

System.out.println(" ".matches(pattern1));
System.out.println("\n".matches(pattern1));
System.out.println("\t".matches(pattern1));

// 소문자단어 3개로 이루어져있는지?
String pattern2 = "\s*[a-z]+\s[a-z]+\s[a-z]+\s*";
System.out.println("hello world java".matches(pattern2));
System.out.println("hello world".matches(pattern2));
System.out.println("   hello world java   ".matches(pattern2));

5.12.15 특수기호 공백문자 - 2

public class C20Regex {
    public static void main(String[] args) {
        String str1 = "  al ad al   aldkfj a   asdflk asdf  as;df a  ";
        String str2 = str1.replaceAll("\\s+", "");

        System.out.println(str1);
        System.out.println(str2);

        String str3 = "alierj   ,    lakjdf,akdfj  ,   aldjkfa";
        String[] str4 = str3.split("\s*,\s*");

        System.out.println(Arrays.toString(str4));
    }
}

5.12.16 특수기호 워드

word character : \w
영문대소문자 숫자 언더스코어확인하는 특수문자

String pattern1 = "\\w";
String pattern2 = "[0-9a-zA-Z]";

System.out.println("a".matches(pattern1)); //true
System.out.println("a".matches(pattern2)); //true

//영대소문자 숫자 언더스코어로 일루어진 단어 2개로만 표현된 문자열
String pattern3 = "\\s*\\w+\\s+\\w+\\s*";

System.out.println("Hello World".matches(pattern3)); //true
System.out.println("Hello     World   ".matches(pattern3)); //true
System.out.println("my_name   0108888  ".matches(pattern3)); //true

5.12.17 특수기호 모든문자

Any character(may or may not match line terminators) : .

String partern1 = ".";

System.out.println("a".matches(partern1)); //true
System.out.println("Z".matches(partern1)); //true
System.out.println(" ".matches(partern1)); //true
System.out.println("\n".matches(partern1)); //false

//어떤문자든 3개
String pattern2 = ".{3}";
System.out.println("가나다".matches(pattern2)); //true
System.out.println("   ".matches(pattern2)); //true
System.out.println("가 a".matches(pattern2)); //ture

5.12.17 특수기호 모든문자 - 2

. (모든문자) vs \. (.)

String pattern1 = ".";
String pattern2 = "\\.";

//영대소문자 여러개 .com으로 끝나는지?
String pattern3 = "[a-zA-Z]+\\.com";
System.out.println("daum.com".matches(pattern3)); //true
System.out.println("daum.net".matches(pattern3)); //false
System.out.println("daumcom".matches(pattern3)); //fasle

\\D, W, S이런것은 빼고 라는의미 ^\\d같은 것들임.

5.12.18 한글

영문소문자[a-z]
영문대문자[A-Z]
한글은 유니코드코드표를 기준으로 된다. : 한글[가-힣]

String pattern1 = "[가-힣]";

System.out.println("산".matches(pattern1)); //true
System.out.println("a".matches(pattern1)); //false
System.out.println("3".matches(pattern1)); //false

//이름 : 한글 두글자 이상 공백없이
String pattern2 = "[가-힣]{2,}";
System.out.println("두산".matches(pattern2)); //true
System.out.println("산".matches(pattern2)); //false
System.out.println("백두산".matches(pattern2)); //true

5.12.19 한글 - 2

unicode script
\p{IsHangul} == 한글 [가-힣]

String pattern1 = "[가-힣]";
String pattern2 = "\\p{IsHangul}";

System.out.println("백".matches(pattern1)); // true
System.out.println("두".matches(pattern2)); // true

// 공백없이 2글자이상
String pattern3 = "\\p{IsHangul}{2,}";
System.out.println("백두산".matches(pattern3)); //true
System.out.println("산".matches(pattern3)); //false

5.12.20 그룹

group : ()
패턴이복잡할때 묶고 표현할수잇다.

String pattern1 = "(\\w\\d){2}";
System.out.println("a3_4".matches(pattern1)); // true

//전화번호
//010이 있어도되고 없어도되고 숫자 8개
String pattern2 = "(010)?\\d{8}";
System.out.println("01077777777".matches(pattern2)); //true
System.out.println("55555555".matches(pattern2)); //true

5.13 main()메소드의 String[]매개변수의 용도

문자열들이 main메소드의 파라미터로 들어가게 된다.
메뉴-> Run -> Run Configuration 에서 argument넣으면된다.

public class C01MainArguments {
    public static void main(String[] args) {

        //아규먼트 없이 실행
        //java C01MainArguments

        //아규먼트 전달실행
        // java C01MainArguments Hello Java

        System.out.println(args.length); //2
        System.out.println(args[0]); //Hello
        System.out.println(args[1]); //Java
        //System.out.println(args[2]); 예외
        System.out.println("명령문들...");
    } 
}

6장 클래스

5장은 참조 타입에 대해서 배운거엿다.
데이터 뭉치가 저장되는 곳이 따로 있고 참조값을 변수명의 위치에 저장하는 것이다.
주소를 참조하고 있으니 참조타입이다. 이 참조한 것을 instance(객체, 개체)라고 한다.
자바는 객체를 만들때 설계도가 있어야한다.
5장에서 객체를 어떻게 나누는지 6장은 이제 이 객체를 어떻게 만드는지? 배우는 것이다.
객체는 필드, 메소드가 있다. 설계도에도 필드에대한 정보 메소드에 대한 정보가 잇어야한다.

객체를 생성할때 설계도가 필요하다.
차에 바퀴가 몇개 브레이크 어떤일 등등이 설계도에 작성되어 있다.
실제 굴러다니는 차가 instance(객체) 이것은 여러개가 만들어질 수 있다.
5장이 각 instance가 메모리에 어떻게 저장되는가 엿냐면
6장은 이 설계도를 작성하는 방법을 배우고자 한다.

6.1 Class 만들기

우리가 직접 만든 설계도로 인스턴스 생성
역시나 변수에 담아서 사용해야한다.
String str = new String("Hello");햇듯이 타입은 클래스명이다.
클래스명은 UpperCamelCase로 작성한다.
특별한 일이 없다면 하나의 클래스는 하나의 파일로 작성해야한다.

// 클래스 작성
class MyClass01 {
    //어떤 값을 가져야 하는지?

    //어떤 기능이 있어야하는지?
}

public class C01Class {
    public static void main(String[] args) {
        //5장에서 배웟듯이 서로 다른 instance임.
        MyClass01 var1 = new MyClass01();
        MyClass01 var2 = new MyClass01();
    }
}

6.2 객체 생성과 참조 변수

설계도로 instance를 만들 수 있다. 이것을 참조하는 변수가 잇어야 사용할 수 있다.
타입 역시 클래스 명으로 만들면된다.
변수가 없으면 쓰레기가 되버린다.
Studnet s1 = new Student();
뒤가 객체이고 s1은 참조값만 가지고 있는 것이다.
그러나 부를때는 s1객체 라고 편하게 부른다.
new연산자로 생성하면 같은 설계도라도 다른 참조값을 가지니 다른 객체를 참조하게 된다.

public class StudentExample {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("s1 변수가 Student 객체를 참조합니다.");

        Student s2 = new Student();
        System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");

        System.out.println(s1 == s2); //false

        //참조값을 알고싶다면?
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
    }
}

클래스의 두가지 용도
1.라이브러리클래스 실행할수 없으며 다른클래스를 이용하는 클래스
2.실행클래스 메인메소드를 가지고 있는 실행할 수 있는 클래스이다.
두가지를 나눠서 작성할 것이다.

6.3 클래스의 구성멤버

1.필드
2.메소드

6.4 필드 선언과 사용

클래스는 객체의 설계도이고 값에 대한 정의가 field이다.
객체를 만들고 필드에 접근하고 싶다면 . : 필드 접근 연산자를 사용한다.

public class MyClass01 {
    int age;
    String name;
    int score;
}

public class C01Field {
    public static void main(String[] args) {
        MyClass01 var1 = new MyClass01();

        // . : 필드 접근 연산자
        var1.age = 99;
        var1.name = "son";
        var1.score = 100;

        System.out.println(var1.age);
        System.out.println(var1.name);        
        System.out.println(var1.score);

        MyClass01 var2 = new MyClass01();

        var2.age = 88;
        var2.name = "char";
        var2.score = 200;

        System.out.println(var2.age);
        System.out.println(var2.name);        
        System.out.println(var2.score);
    }
}

6.4.1 필드 -1

초기화 하지 않은 필드
기본타입은 0, false, 참조타입은 null
변수는 초기화 되지 않으면 사용불가하지만 필드는 기본값이 있어서 사용이 가능하다.

public class MyClass02 {
    int age;
    boolean married;
    String name;
}

public class C02Field {
    public static void main(String[] args) {
        MyClass02 var1 = new MyClass02();

        System.out.println(var1.age); //0
        System.out.println(var1.married); //false
        System.out.println(var1.name); //null
    }
}

6.5 메소드

값에 대한 이야기가 '필드'이엇다.
기능에 대한 것이 '메소드'이다.
리턴타입 메소드명 (파라미터 목록) {실행문들}의 형태로 만든다.
메소드는 사용할때는 호출(실행) call, invoke, execute이라고 한다.

public class MyClass01 {
    void methodName(int param) {
        //실행문들...
    }

    void run() {
    }

    void wakeUp() {
    }

    void standUp() {
    }
}

public class C01Method {
    public static void main(String[] args) {
        MyClass01 o1 = new MyClass01();

        //메소드 호출(실행) call, invoke, execute
        o1.run();
        o1.standUp();
        o1.wakeUp();
        o1.methodName(0);

        MyClass01 o2 = new MyClass01();
        o2.run();
        o2.standUp();
        o2.wakeUp();
        o2.methodName(0);
    }
}

6.5.2 메소드

메소드안에 변수를 선언할 수도 있고
선언된 필드를 사용할 수도 있다.
각각 객체가 가지고 있는 instace필드, 메소드라고 할 수 있다.

public class MyClass03 {
    //(instance) field
    String name;

    //(instance) method
    void greeting() {
        String to = "여러분";
        System.out.println(to + "안녕하세요.");

        System.out.println("저는 " + name + "입니다.");
    }
}

public class C03Method {
    public static void main(String[] args) {
        MyClass03 o1 = new MyClass03();

        o1.greeting(); //저는 null입니다.

        o1.name = "son";

        o1.greeting(); //저는 son입니다.
    }
}

6.5.3 파라미터

메소드 실행시 정의된 파라미터의 타입과 순서, 개수에 맞춰서
아규먼트를 입력(전달)해야한다.

public class MyClass04 {
    void method1() {
        System.out.println("파라미타가 없는 메소드");
    }

    void method2(int param1) {
        System.out.println("인티저 파라미터 하나 받는 메소드");
    }

    void method3(String param1)
    {
        System.out.println("스트링 파라미터 하나 받는 메소드");
    }
}

public class C04Parameter {
    public static void main(String[] args) {
        //메소드 실행시 정의된 파라미터의 타입과 순서, 개수에 맞춰서 아규먼트 입력(전달)해야한다.
        MyClass04 o1 = new MyClass04();
        o1.method1();
        //o1.method1(3); 불가능 

        o1.method2(5);
        //    o1.method2();불가능

        o1.method3("hello");
    }
}

6.5.3 파라미터 -2

파라미터는 호출될때 값이 정해진다.

void method2(int x, int y) {
    System.out.println(x + " + " + y + " = " + (x+y));
}

o1.method2(10, 20); //30
o1.method2(30, 50); //80

6.5.4 파라미터 -3

변수에서 자동형변환이 일어낫듯이 파라미터에서도 자동형변환이 된다.

public class MyClass06 {
    void method1(int i) {
        System.out.println("정수 파라미터 하나 받는 메소드");
    }

    void method2(long param) {
        System.out.println("long 파라미터 하나 받는 메소드");
    }
}

public class C06Parameter {
    public static void main(String[] args) {
        MyClass06 o1 = new MyClass06();
        o1.method1(33);
        o1.method1('c'); //가능

        o1.method2(29979844546497987L);
        o1.method2(33); //가능
        o1.method2('d'); //가능
    }
}

6.5.5 메소드 오버로딩

파라미터 개수, 순서, 타입에 맞게 아규먼트를 전달해야한다.

메소드 오버로딩(overloading)
파라미터 개수 순서 타입이 다르면 이름이 같더라도 다른 메소드이다.

public class MyClass07 {
    void method1(int i) {
        System.out.println("정수 하나 받는 메소드");
    }

    void method1(long i) {
        System.out.println("long 하나 받는 메소드");
    }

    void method1(int i, int j) {
        System.out.println("정수 두개 받는 메소드");
    }

    void method1(String i, int j) {
        System.out.println("문자열 하나, 정수하나 받는 메소드");
    }

    void method1(int j, String i) {
        System.out.println("정수 하나, 문자열 하나 받는 메소드");
    }
}

public class C07Overloading {
    public static void main(String[] args) {
        MyClass07 o1 = new MyClass07();

        o1.method1(9);
        o1.method1(23994L);
        o1.method1(33, 99);
        o1.method1(3, "hello");
        o1.method1("java", 9);
    }
}

메소드 오버라이딩을 모르지만 사용하고 있었다.
-> System.out.println();
일때 int long String등에 따라서 알아서 출력되었다. 실제로 오버로딩되어있다.

public class C08Overloading {
    public static void main(String[] args) {
        System.out.println(3);
        System.out.println(5464L);
        System.out.println("hello");
        System.out.println(3.14);
    }
}

6.5.6 확인문제 16번

println()메소드를가진 Printer클래스 만들기

public class Printer {
    public void println(int i) {
        System.out.println(i);
    }

    public void println(boolean b) {
        System.out.println(b);
    }

    public void println(double d) {
        System.out.println(d);
    }

    public void println(String str) {
        System.out.println(str);
    }
}

public class ex16 {
    public static void main(String[] args) {
        Printer printer =  new Printer();
        printer.println(10); //10
        printer.println(true); //true
        printer.println(5.7); //5.7
        printer.println("홍길동"); //홍길동
    }
}

2023.02.27 후기

드디어 자바의 클래스파트를 시작한다. 헷갈렷던 개념들을 질문하면서 나아가고자 한다.