728x90

귀로 듣고 이해하면 1~3일 기억력 지속됨.

눈으로 보고 이해하면 3~7일 기억력 지속됨.

3~4일 끙끙앓다 코드 완성하면 기억력 1년됨. =>손으로 코드짜면서 공부하기.

 

<복습>

객체지향 프로그램 : 객체들끼리 상호작용 할 수 있도록 만듧.

상태와 행동으로 구분되어질 수 있는 특성을 가진다. =>객체객

공통된 데이터구조와 기능을 추출하여 클래스를 만든다. 멤버변수와 메소드로 표현가능함.

new연산자를 통해 클래스로 부터 객체를 생성함.

객체가 생성되면 공통된 데이터구조와 기능을 기반으로 새로운 메모리가 할당되어 진다.

메모리할당 -> 변수나 메소드와 관련한 것들을 사용할 수 있음.

생성자 : 클래스 이름을 하고 있는 생성자로서 객체가 생성되어지면 자동으로 호출되어지는 것, 리턴타입은 없고 객체를 초기화하는 용도로 사용되어 집니다.

new연산자를 만들고 -> 생성자 만들러 가기!!

객체를 생성하고 싶은데 에러가 뜬다 -> 그에 해당하는 생성자가 없기 때문에

객체를 생성할 때는 생성자 파라미터를 보아라!!

특정객체가 또다른 객체를 포함해야 할 때 : 다른 객체와 relation관계를 맺는다. 

연관관계 (실선) : 해당클래스의 멤버영역에 초기화된다.   

의존관계(점선) : 특정메소드의 파라미터나 특정메소드 안에서 사용되어 진다.

집합관계 : 연관관계의 한 종류 - 나 이외에 다른데서도 사용할 수 있음.

합성관계 : 연관관계의 한 종류 - 나에게서 떨어져 있으면 의미가 없어짐

캡슐화 : 접근제어자를 private로 바꾸어 줌으로써 다른 클래스에서 사용할 수 없도록 만듦. 그 안에 있는 setter나 getter로만 우회해서 이용할 수 있게 만듦.

static : 클래스의 , 공용적으로 사용할 수 있다. 객체생성 않고도 사용할 수 있다. 클래스 영역이다. 변수 앞에쓰면 메모리가 딱 한번 올라가서 공용변수처럼 쓴다. 메소드도 딱한번 처음 메모리 올라가서 객체생성 없이도 사용할 수 있다. 

클래스이름. 클래스변수; 로 사용가능함.

상속 : 기존에 있는 부모에 있는 코드를 확장해서 사용하기 위해서

상속, 연관관계 : 기존에 있는 메소드를 사용할 수 있음. 확장성을 생각한다면 상속, relation을 생각하려면 연관관계.

 

상속받은 자손은 객체를 생성했을 때 부모클래스를 먼저 생성하기 때문에 부모의 default생성자를 호출한다. 그 후에 내 생성자가 호출되어짐. default생성자 아닌 파라미터 있는 생성자를 호출하고 싶으면 super함수를 사용.    ->자바9차시에 있음-상속내용

 

-오버라이딩의 기본 조건

  1. 상속을 받아야 함

  2. 부모의 메소드의 시그니처와 이름이 같아야 한다. -> 내용만 달라야 함.

오버라이딩 하는 이유 : 나중에 형변환을 통해 자바의 다형성을 표현하기 위해서

 

-자바의 다형성 조건

  1. 상속관계의 casting이 이루어져야 한다.

  2. 부모자식간의 오버라이딩된 메소드가 있어야 한다.

 

모든객체간의 형변환은 가능하다?

No. 상속관계, 인터페이스관계에서만 형변환이 가능하다. 

다중상속x, 다중인터페이스o

형변환을 하는 이유 : 서로 다른 객체들을 한가지 공통분모로 모으기 위해서, 

자식이 부모로 형변환을 하면 기존 자신이 가지고 있는 변수나 메소드를 사용할 수 없다. 다만 오버라이딩 된 메소드만 사용가능하게 해놓음. 

이후로 다시 부모에서 자식으로 돌아가기 위해 강제캐스팅해줘야 함. (자식클래스)

처음부터 부모였던 아이는 자식으로 강제캐스팅이 불가함.

instanceof 연산자를 통해 casting의 가능 여부를 확인할 수 있다.

 

--추상클래스와 인터페이스의 공통점과 차이점

추상클래스 : abstract메소드가 하나이상 있으면 추상클래스. 인스턴스화를 할 수 없다. new연산자를 통해 객체를 생성할 수 없다.

자식클래스로 부터 상속되어지기 위해 만들어진 것일뿐. 추상클래스를 상속하면 추상메소드를 강제로 오버라이딩해야 한다. 코드의 독립성과 일관성을 위해서 =>run메소드 사용

인터페이스 :  자바의 다중상속지원이 안되어서 다중상속이 되는 인터페이스를 구현함. (Runnable 인터페이스 구현 가능), 이 안에는 추상메소드만 가지고 있다.

공통점 : 추상메소드(내용이 없는 메소드)를 가지고, 코드의 일관성과 독립성을 구현할 수 있다.

차이점 :  추상클래스는 추상메소드와 일반메소드를 둘 다 가지고 있을 수 있고, 인터페이스는 추상메소드만 가짐.

 

내가 만든 코드 : 코드의 일관성과 독립성을 위해

자바 API : 해당 기술을 구현하기 위한 방법

 

인터페이스로도 자바의 다형성을 표현할 수 있다. ->형변환이 가능하기 때문에

 

11장. Object클래스

object클래스의 메소드들

-toString 메소드 : 객체가 가진 값을 문자열로 만들어서 리턴하는 메소드

주소값이 출력되는 이유 : object에 있는 toString메소드는 주소값을 출력하도록 설계되어져 있다. 

객체안에 있는 값을 출력하기 위해서 오버라이딩해서 내가 새로 만든다.

 

부모의 메소드가 맘에 안듦 -> 오버라이딩해서 내가 새로만듦

account안에도 toString메소드를 만들어 주면 주소값이 안나올 수 있음.

 

                 Account account = new Account("홍길동","11111-1111",10000);

                 Account account2 = new Account("홍길동","11111-1111",10000);

        

                 String str = account.toString();

                 System.out.println(str);

 

Kosta.Account@15db9742

 

@Override

public String toString() {

        return "Account [ownerName=" + ownerName + ", accountNo=" + accountNo + ", balance=" +  balance + "]";

}

 

             String str = account.toString();

                 System.out.println(str);

 

Account [ownerName=홍길동, accountNo=11111-1111, balance=10000.0]

-equals메소드

계좌번호가 같다면 서로 같은 것으로 나오게 하기.

Account account = new Account("홍길동","11111-1111",10000);

Account account2 = new Account("홍길동","11111-1111",10000);

 

                if(account.equals(account2)) {

                        System.out.println("같음");

                }else

                        System.out.println("다름");

다름

기존의 equals메소드는 주소값을 비교해주는 것 =>account와 account2는 각자 다른 주소값을 가짐. 두 객체가 가진 value값을 비교하기 위해선 equals메소드를 Account클래스에 오버라이딩하여 객체내용을 비교하도록 변경할 수 있다.

 

--Account클래스

public boolean equals(Object obj) {

                if(obj instanceof Account)

                        return accountNo ==((Account)obj).accountNo;

                else

                        return false;

        }

 

--AccountMain클래스

if(account.equals(account2)) {

                        System.out.println("같음");

                }else

                        System.out.println("다름");

 

 

같음

 

12장. Wrapper클래스

 

레퍼런스타입에 데이터타입을 넣으면 오류가 뜸

기본 데이터타입을 오브젝트타입으로 형변환 가능하도록 Wrapper형으로 변환.

데이터타입 -> 객체형타입으로 변환가능 ->데이터타입으로 다시 돌리기 가능

int -> obj -> int

 

-정적메소드

클래스 이름으로 가져왔으니 정적메소드이다.

 

-Boxing : 박스에 넣기

-Unboxing : 박스에서 꺼내기

자동박싱 & 자동언박싱

 

-언박싱 : 래퍼 클래스의 객체를 기본형 값으로 자동 변환해주는 것

-자동박싱 : 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것

obj로 형변환 안하고 그냥 dobule형으로 써줘도 자동변환해줌.

 

-16장 네스티드클래스와 네스티드 인터페이스

 

클래스 안의 클래스(하나의 멤버변수라고 생각하기)

 

-이너 클래스의 사용 방법

Cart{

        Item(

                item;

            )

}

-이너 클래스의 사용 방법

Map.Entry(내부 인터페이스) (예시)

 

-이너 클래스의 객체생성방법 : 잘안씀

 

-정적 네스티드클래스 : static 필드라고 생각하기

 

-로컬 이너 클래스 : 메소드 안에 클래스가 들어가있음

보통 : 추상클래스를 상속받아서 메소드 오버라이딩해서 이 클래스의 객체를 생성

 

★★익명내부클래스 : 한번쓰고 말거라서 클래스 안만들고싶음.

MessageSender - 추상클래스 -> 이름 없는 이너클래스(익명클래스)

class _A__ extends MessageSender{

@override

}

A a = new A;

__.___

새로운 클래스 안만들고도 바로 호출하고 사용가능

         

           Role r = new Role() {

                        

                        @Override

                        public void doIt() {

                                System.out.println("열심히 공부");

                                

                        }

                };

                

                p.setRole(r);

                p.doIt();

열심히 공부

원래는 새로운 Student클래스를 만들었어야 했지만 익명내부클래스를 만들어 한번만 호출가능함.

 

인터페이스도 가능

Speakable sp = new Speakable() {

                        

                        @Override

                        public String speak() {

                                return "드라이버,,,";

                        }

                };

                System.out.println(sp.speak());

드라이버,,,

 

 

 

**JAVA

  1. 프로그램기초

  2. 객체지향

  3. 자바 API

 

 


기초 API

  1. ★자료구조 : **list map, set

  1. 입출력(I.O) - 예외처리

  2. 쓰레드 - 멀티쓰레드 구현(1~10, 10~11같이 출력)

  3. 자바네트워크 나머지 ....JSON, JDBC(db배운후 서블릿jsp배울때 같이 배울 예정)

 

J2SE(자바) ->J2EE(서버프로그램)

 

9장. 기초적인 자바 클래스들

 

String클래스(불변성)

    •  

String str = "abc"; 이렇게 해도 객체가 생성되도록 혜택을 준것임

  •  

String - Object(레퍼런스형) abc가 주소값에 들어가있음 -> 주소값 참조함.

str.replace,    str.concat

-String 클래스는 문자열 조작에 적합하지 않음 ->수정불가

-문자열 조작에 적합한 클래스(가변성) : StringBuilder클래스, StringBuffer클래스  sql.append(메소드로사용)

-문자열로부터 작은 단위 문자열을 추출하는 클래스 : String Tokenizer클래스

 

쿼리문 select *from -> 동적쿼리문이 되어야 함.

sql = 

    if{

        sql + =

      }

그래서 자바랑 디비랑 짬뽕이 되어서 mybatic 씀 

 

----String클래스의 불변성 -> +연산자로 바꿀 수 있음.

public class StringExam {

        public static void main(String[] arge) {

                String str = "ABC"; //메모리 올라올 때 눈치를 봄 ABC가 있나없나 없으면 새로만들어.  있으면 참조해

                String str2 = new String("abc"); //새로운게 좋아 새로운 메모리 그냥 만들어

                

                //String 불변성

                String str3 = str.concat(str2);

                System.out.println(str);

        }

 

ABC

 

System.out.println(str3);

 

ABCabc

 

-동적쿼리문

String sql = "select*from board ";

                int num =10;

                if(num == 10) {

                        sql += "where num =10";

                }

                System.out.println(sql);

 

select*from board where num =10

 

-StringBuffer, StringBuilder

//StringBuffer, StringBuilder

                StringBuffer sb = new StringBuffer("가나다");

                sb.append("라마바");

                System.out.println(sb);

 

가나다라마바

 

-sql.indexOf

//해당 문자열의 위치를 파악 -> indexOf("문자열") => 0시작 , 없으면 =>-1

                System.out.println(sql.indexOf("board"));

12

 

//문자열 길이

                System.out.println(sql.length());

31

 

//문자열 부분추출 substring(5)->5이후부터 출력, substring(5,11) ->5에서 10까지

                //select*from board where num =10

                System.out.println(sql.substring(2, 4));

le

 

//sql변수 문자열에 "board"단어를 추출해보자 단,indesOf()와 substring을 사용하여

                System.out.println(sql.substring(sql.indexOf("board"), sql.indexOf("board")+5));

 

board

 

String fileName = "kosta.jpg";

                String head = fileName.substring(0,fileName.indexOf("."));

                String pattern = fileName.substring(fileName.indexOf(".")+1,fileName.length());

                

                System.out.println(head + " : "+pattern);

 

kosta : jpg

 

String id = "kosta";

                String m_id = "Kosta ";

                

                if(id.equalsIgnoreCase(m_id.trim())) { //소,대문자 같다고 봄.//앞뒤에 있는 공백들  제거

                        System.out.println("같다");

                }else {

                        System.out.println("다르다");

                }

 

같다

 

//문자열 => 배열 전환

                String fruits = "사과.배.포도.수박";

                String arr[] = fruits.split("\\."); //string이 "."을 문법적요소로 고려함. 그래서 역슬래쉬 두개침.

                

                for(String name : arr) {

                        System.out.println(name);

                }

사과

포도

수박

 

//startWith(), endsWith() : 해당문자열로 시작/종료하는지 체크

                //이미지 파일 (jpg,png,gif)유무 체크 kosta.jpg

                if(fileName.endsWith("gif")||  fileName.endsWith("jpg")||fileName.endsWith("png")) {

                        System.out.println("이미지 파일");

                }else {

                        System.out.println("일반파일");

                }

 

★★

getBytes() :      중요  -> 문자열을 바이트로 전환할 때

***정규표현식 - matches, replaces 등등

String path = "C:\\Users\\Public\\Pictures\\Sample Pictures\\등대.jpg";

                //String result = "";//등대_small.jpg

                String fileName2 = path.substring(path.indexOf("등대"));

                System.out.println(fileName2);

                

                String pattern2 = fileName2.substring(fileName2.indexOf(".")+1);

                String head2 = fileName2.substring(0,fileName2.indexOf("."));

                

                String result = head2 + "_small." + pattern2;

                System.out.println(result);

등대.jpg

등대_small.jpg               

 

--날짜와 시간에 관련된 클래스들

Calendar / GregorianCalendar

public static void main(String[] args) {

//              GregorianCalendar gc = new GregorianCalendar();

                Calendar gc = Calendar.getInstance();

//              System.out.println(gc);

                String now = gc.get(Calendar.YEAR)+"년 "

                        +(gc.get(Calendar.MONTH) +1 )+"월 "     

                        +gc.get(Calendar.DATE)+"일 "

                        +gc.get(Calendar.HOUR)+"시 "

                        +gc.get(Calendar.MINUTE)+"분 ";

                

                System.out.println("현재시간 "+now);

        }

 

현재시간 2020년 7월 16일 4시 43분

 

 

//100일 기념일

                gc.add(Calendar.DATE, 100);

                

                String future = gc.get(Calendar.YEAR)+"년 "

                                +(gc.get(Calendar.MONTH) +1 )+"월 "     

                                +gc.get(Calendar.DATE)+"일 "

                                +gc.get(Calendar.HOUR)+"시 "

                                +gc.get(Calendar.MINUTE)+"분 ";

                        

                        System.out.println("100일 후 날짜 : "+future);

 

100일 후 날짜 : 2020년 10월 24일 4시 46분

 

     

   //첫만남

                gc.set(2020, 1, 19);//2월 19일

                gc.add(Calendar.DATE, 200);

                

                SimpleDateFormat dateFormat =

                                new SimpleDateFormat("yyyy-MM-dd hh:mm");

                String str = dateFormat.format(gc.getTime());

                System.out.println("2월 19일 시작 200일 후에" +str);

 

2월 19일 시작 200일 후에2020-09-06 04:52

 

요일과 관련된 것

 

char[] week = {'일','월','화','수','목','금','토'};

                

                for(int i=2020;i<=2030;i++) {

                        gc.set(i, 10, 20);

                        char c= week[gc.get(Calendar.DAY_OF_WEEK)-1];

                        System.out.println(i+"년의 생일은 "+c+"요일 입니다.");

                }

2020년의 생일은 금요일 입니다.

2021년의 생일은 토요일 입니다.

2022년의 생일은 일요일 입니다.

2023년의 생일은 월요일 입니다.

2024년의 생일은 수요일 입니다.

2025년의 생일은 목요일 입니다.

2026년의 생일은 금요일 입니다.

2027년의 생일은 토요일 입니다.

2028년의 생일은 월요일 입니다.

2029년의 생일은 화요일 입니다.

2030년의 생일은 수요일 입니다. //음력은 안나옴.

 

                

Mission

-Calendar문제

-딱지 알고리즘

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts