package com.util;

import java.awt.image.SinglePixelPackedSampleModel;

//Singleton pattern 이 적용된 클래스
//객체 생성을 한번만 수행하고 그 이후로는 생성된 객체 공유
//singleton pattern 객체 조건

//private, static field : 필드는 static 이고 private 이여야 한다.
//생성자 private 이여야 한다. (외부에서 객체 생성이 불가능함)
//getInstance():객체를 생성해서 리턴해 주는 static method가 꼭 있어야 한다.

public class SingletonObject {

    private static SingletonObject instance; //자기 자신 타입 SingletonObject 인 필드 생성
    
    private SingletonObject() { //생성자는 private 이여야 한다 (외부에서 객체 생성이 불가능하게)
        
    }
    
    public static SingletonObject getInstance() { //객체는 getInstance() 통해서만 생성 가능하게 한다
        if(instance == null) {
            instance = new SingletonObject(); // 이미 만들어진 instance 가 없으면 객체를 생성하고
있으면 바로 return 해준다
        }
        return instance;
    }
    
    public void print() {
        System.out.println("hello, print!");
    }
    
}

생성자를 접근을 못하니까 바로 메소드를 불러서 객체를 생성한다.
package com.util;

public class SingletonObjectUser {

    public static void main(String[] args) {
        SingletonObject o1 = SingletonObject.getInstance(); //생성자를 메소드로 불러서 객체 생성
        SingletonObject o2 = SingletonObject.getInstance();
        SingletonObject o3 = SingletonObject.getInstance();
        
        o1.print();
        o2.print();
        o3.print();
        
        System.out.println(o1==o2);
        System.out.println(o3==o2);
    } 
}



타입상속 : 추상클래스, interface

부모 클래스에서 추상(미완성) 메소드를 자식에게 물려줌



타입 상속
여러 종류의 객체들을 하나의 배열에 넣고 핸들링 하면 좀 편하게 사용 할 수 있다.

ex) 상속 관계로 묶지 않으면 여러 클래스에서 객체를 만들고 list 에 쓸려면 각각 만들어야하는데

큰타입(부모클래스)로 만들면 부모클래스 타입으로 배열을 만들고 객체에 집어 넣을 수 있다


Shape (추상 클래스)
getArea() - 추상 메소드
getCircum() - 추상 메소드
Circle Rect TriAngle
getArea() getArea() getArea()
getCircum() getCircum() getCircum()

자식 클래스가 상속받은 추상 클래스를 완성시켜야한다.

추상클래스를 상속받을려면 무조건 오버라이딩을 해서 완성을 시키던가

아니면 자식 클래스도 추상클래스로 만들어야한다.

추상 메소드도 없는데 클래스를 추상클래스로 바꾸는 이유=> 객체 생성 못시키게 할려고



#Wrapper class

Java의 기본형 데이터 타입을 객체화 시키는 클래스들이다.
Java 5.0 버전 이상에서 자동으로 type 변경 기능을 제공한다.

int num = 99; // 기본형 입니다.
//기본형 데이터를 참조형(클래스)로 바꿈
Integer num2 = new Integer(num);
num2++; //객체라서 더하기가 안되는데, 내부에서 auto-unboxing이 일어나고 연산을 하고
다시 auto-boxing이 일어남
System.out.println(num2);   

int 타입으로 명시적으로 박스를 풀수도있다.
int x =num2.intValue();



#StringBuilder

문자열을 편집하여 사용하고자 할 경우에 사용하는 클래스이다.
String의 수정을 편리하게 한다.
StringBuffer 클래스를 개선하여 성능을 향상한 클래스이다.

ex)
StringBuilder sb =new StringBuilder("mylimeorange");ㅕ
sb.append("hello"); //String class 에서 concat() 함수와 비슷하다.
System.out.println(sb); //sb.toString() 가 호출된다.
=>mylimeorangehello

sb.setLength(5); //sb의 length를 강제로 5로 출력한다.
System.out.println(sb);
=>mylim

sb.insert(2, 'q'); //인덱스가 2번인 위치에 q를 끼워 넣어라
System.out.println(sb);
=>myqlim

sb.reverse(); //뒤집어 준다.
System.out.println(sb);


String 클래스와 차이점은
따로 저장을 안해도 변화가 바로바로 반영이 된다.






#String 클래스

String s = "mylimeorange";
String t = new String("mylimeorange");
String x = "mylimeorange";

new로 만들면 heap에 객체가 생성된다.
s 처럼 값을 그냥 주면 class area 안에 있는 Constant Pool 에 저장한다.


if(s == t) { //주소 비교하는거라 false
    System.out.println("s==t"); //false
}


if(s.equals(t)) { //내용 비교 String 에서 equals는 내용 비교이다. 기본 Object 에서는 주소비교이다 (재정의 한거임 )
    System.out.println("s.equals(t)"); //true
}

if(s==x) { //주소를 비교하는데 constant pool 에 같은 "mylimeorange" 을 가리키고 있다.
    System.out.println("s==x");
}
String 클래스는 원본의 값을 바꿀수 없다.


s.toUpperCase();
System.out.println(s); //대문자로 바꿔라.
String은 값이 하나 들어가면 원본데이터를 바꿀수가 없다

String a=s.toUpperCase();
System.out.println(a);
이런식으로 따로 저장해서 따로 생성된 값을 사용해야한다.

s=s+"gogogo";
System.out.println(s);
s 는 mylimeorangegogogo 를 가리키게 된다.


#String 메소드

String s = "mylimeorange";
s.length() -문자열의 길이를 출력해주는
s.charAt(3) -인덱스가 3번인 글자 하나
s.isEmpty() - 비어있니?
s.startsWith("m")- m으로 시작하니?
s.endsWith("e") -e로 끝나니?
s.substring(2,6) - 문자열 분할 2번 인덱스 부터 5번 인덱스 까지
s.substring(7) - 7번 인덱스 부터 끝까지
s.contains("r") - 문자열 r 을 포함하니?


#concat()

문자열 뒤에 추가시켜주는 경우
String q =s.concat("hello");
//s.concat("hello");
System.out.println(q);




#equals(Object o) : boolean - 객체의 내용을 비교 할 수 있도록 구현한다.

Truck t1 = new Truck(4,"abc",2019);
Truck t2 = new Truck(4,"abc",2019);
System.out.println(t1==t2); //주소 비교
System.out.println(t1.equals(t2)); //내용 비교 (밑에서 오버라이딩 해서 내용비교가 된다,
재정의 안해주면 주소비교라서 false)

둘다 false 가 나오는데
== 연산자의 경우 주소를 비교하는거니까 무조건 false 가 나오는데
equals()는 기본 object에서 주는 클래스로 들어가 보면 == 연산자로 비교하고 있다
그래서 재 정의해서 주소값 말고 내용을 비교 할 수 있도록 사용해야한다.

@Override
public boolean equals(Object obj) {
    if(obj !=null && obj instanceof Truck) {
        Truck t = (Truck)obj;
        if(num == t.num && model.equals(t.model) && year ==t.year) {
         return true;
            }   
        }
    return false;
}


//객체 비교하면 주소값이 비교가 되서 재정의 하지 않으면 equals로 내용을 비교할 수가 없다..

String class equals 는 내용 비교하는거로 바꿔서 그냥 사용할 수 있다.



#toString

package com.ssafy;

public class Truck {
    int num;
    String model;
    int year;
    
    public static void main(String[] args) {
        Truck t = new Truck(4,"abc",13);
        System.out.println(t); //toString() 호출
        System.out.println(t.toString());
    }

    public Truck(int num, String model, int year) { //생성자
        this.num = num;
        this.model = model;
        this.year = year;
    }

    
    @Override
    public String toString() {
        return "hello"; //오버라이딩 이름, 리턴타입, 파라메터, 모두 같아야한다,
// 접근 지정자가 커지는건 가능하지만 작아지는건 불가능하다.
    }


}

System.out.println(t); //toString() 호출
객체만 넣어줘도 재 정의된 toString() 이 호출된다.

@Override

public String toString() {
    return "hello";
}

이거 재정의 안하면 com.ssafy.Truck@15db9742 이런식으로 주소 값만 출력된다.
// 많이 봤지..? 그냥 처음부터 재정의 해주던가. 객체 접근할때 좀더 신경써서 접근할 수 있도록



#Reference Type Casting

래퍼런스 타입의 변수들은 상속관계일 경우 형변환이 가능하다.
Member cc = new MainMember();
MainMember c = (MainMemver) cc; //큰타입에 작은 타입으로 형변환은 가능하지만
이건 가능하지만

Member cc = new Member();
MainMember c = (MainMemver) cc;
이건 컴파일은 되고 실행하면 캐스팅 오류가 난다.

Parent c = new Child();
Child xx = (Child)c; // 큰 타입을 작은 애로 형변환 가능.
// 통은 큰데 들어있는 내용이 작으니 가능
이러면 자식 클래스의 메소드, 필드에 접근이 가능하다.
이거 역시 가능하지만

Parent c = new Parent(); // 진짜로 큰 타입을 작은 걸로 형변환 안됨.
Child xx = (Child)c;
// 통도 크고 들어있는 내용도 크면 작은 걸로 못들어감.



#문자열 공백 제거 Trim() 함수

String str = " 문자열에 공백이 있습니다. ";        
System.out.println(str);

str = str.trim();
System.out.println(str);

문자열에 공백이 있습니다.
문자열에 공백이 있습니다.



#배열에 객체가 넘어갔을때

File playList[]=new File[size];
File 타입에 playList 배열을 하나 생성하고 그 배열에 객체 값을 넣게되면

playList[0]=fl;
이렇게 fl이라는 객체가 들어가게 되면 fl객체의 레퍼런스(주소)값이 들어가게 된다.
그래서
playList[0].get..()
playList[0].set..()
playList[0].prittName()..
이런식으로 객체의 field, 메소드 에 접근이 가능하다.


main(){
    File fl = new File("mp3", 500, "Home");
}




# 클래스가 여러개 있을때는 하나의 클래스만 public 이 가능하다



파일명 :AccessTest.java

package com.ssafy;

class Apple{}

class Banana{}

class Orange{}


public class AccessTest {

}

//실행하면 클래스 마다 실행파일이 나온다

//public 클래스는 하나만 허용한다.

public 클래스는 파일명 클래스만 사용이 가능하다.

그래서 AccessTest 를 통해서만 접근이 가능하다.


#패키지가 다를때


package korea.busan; //부산 패키지 에 있는 Bill 이 Tommy class를 이용하고 싶으면
import korea.seoul.Tommy; //import 를 통해서 가지고 와야한다.
//기본적으로 java.lang 은 import 되어있다.

package korea.seoul;

public class Tommy {
    int age=36;
    
    public void go() {
        System.out.println("gogo~");
    }
    
}

근데 보통은 이클립스에서 import하기 편하게 지원을 해주는 편이다




public class Bill {

    public static void main(String[] args) {
            Tommy t =new Tommy();
            t.go();
System.out.println(t.age); // 값 출력하고 싶으면 age 의 제한을 public 으로 바꿔야한다.
            //여기서 Tommy의 go() 메소드는 접근이 가능하고 age 필드 값은 접근이 불가능한 이유는
접근 제한자가 다르기 때문이다.
    }

}


 문서화 주석 

package com.test;
//한줄주석
/*
* 여러줄 주석
*/
/**
* 문서화 주석
* @author tom
* @version 1.0
* @since 8.0~
* @see Dog
*/

public class Cat {
//필드값 위에
/**
* 고양이 이름
*
*/
    String name;
    //메소드 위에
    /**
     * 정수 두개의 합을 리턴하는 메소드
     * @param a 합을 구할 첫번째 파라메터
     * @param b 합을 구할 두번째 파라메터
     * @return 합의 결과
     * @see Dog#sum(int, int)
     */
    public int work(int a, int b) {
        Dog g = new Dog();
        int result=g.sum(a,b);
        return result;
    }
}

이런식으로 주석을 적어주고
Project->Gnerate Javadoc -> C:\Program Files\Java\jdk1.8.0_191\bin\javadoc.exe 설정 해주고 -> 만들기



Eclipse 기준


C - Movie //클래스 이름
========================
(0)title:String //변수이름:타입 접근제한자(public-녹색) 에 따라서 다르게 표시가 된다
(1)title:String //변수이름:타입 접근제한자(protected-노란색)
(2)title:String //변수이름:타입 접근제한자(void-파란색)
(3)title:String //변수이름:타입 접근제한자(private-빨강)
========================
run():void //메소드이름:반환형
stop():void
========================


JVM Memory 구조


JVM Memory 구조
.java -> .class

| class area
class 정보, static 정보등

| heap
객체가 생성되는 공간
객체가 만들어 지면서 주소값이 지정된다.

| java Stack |
main 메소드 수행공간




#문자열->단어 하나 하나로 배열 저장하기


#문자열->단어 하나 하나로 배열 저장하기
findWord(int i, int j, String string){
    char array[] = new char[string.length()]; //새로운 배열 하나 저장하고

    for (int a = 0; a < string.length(); a++) { //string 길이 만큼 배열에 복사해준다.
        array[a] = (char)string.charAt(a); // 넘어오는 값을 char로 형변환 시키고 저장
    }
}

//결과값
array[0]='h';
array[1]='e';
array[2]='l';
array[3]='l';
array[4]='o';

main{
    findWord(1,1,"hello");
}


#s.split("");

String s 를 입력받고  split() 함수를 이용해서 한글자 한글자 배열로 저장하면 된다,.  









배열 크기, row좌표, column좌표

* ex) 3 1 1
public class FillCell2_2 {
    static int N;//배열 크기
    static int[][] map; //배열 선언
static boolean inRange(int nx, int ny) {
        if(nx>=0 && nx<N && ny>=0 && ny<N) { //x , y 범위 값 설정
            return true;
        }else {
            return false;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N=sc.nextInt(); //N 입력받고
        map=new int[N][N]; //map 배열 생성
        
        int x=sc.nextInt(); //기준점이 되는 x좌표
        int y=sc.nextInt(); //기준점이 되는 y좌표
        
        int dx[] = { -1, 1, 0, 0 }; //x좌표
        int dy[] = { 0, 0, 1, -1 }; //y좌표
        
     for(int i=0; i<dx.length; i++) {
            int nx= x+dx[i];
            int ny= y+dy[i];
            if(inRange(nx,ny)) { //범위 설정
                map[nx][ny]=1; // 범위가 true 면 1을 대입 아니면 안한다.
            }
        }
        /// 처리 코드 작성
        
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }
}


8방향 확인 하는 방법


#8방향 확인 하는 방법

static boolean inRange(int nx, int ny) {
        if(nx>=0 && nx<N && ny>=0 && ny<N) { //x , y 범위 값 설정
            return true;
        }else {
            return false;
        }
    }


int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
for(int i=0; i<dx.length; i++) {
    int nx= x+dx[i];
    int ny= y+dy[i];
    if(inRange(nx,ny)) { //범위 설정
        map[nx][ny]=1; // 범위가 true 면 1을 대입 아니면 안한다.
        }
}

#입력좌표에서 지정한 칸수만큼 상하좌우로 1 채우기

#입력좌표에서 지정한 칸수만큼 상하좌우로 1 채우기
    입력 : 배열의 크기, row좌표, column좌표, 칸수
    
        for(int i=1; i<=num; i++) {     
            for(int j=0; j<dx.length; j++) {
                int nx=x+dx[j]*i;
                int ny=y+dy[j]*i;
                if(nx>=0 && nx<N && ny>=0 && ny<N) {
                    map[nx][ny]=1;
                }
            }       
        }

칸수 만큼 반복을 처리하는데, * 연산자를 통해서 칸수를 1,2,3,4 씩 늘려갈 수 있도록 설정한다.

여기서 좀 더 생각해보면 지정칸수 만큼 움직이는 문제들에 응용이 가능하다.
한칸, 두칸, 세칸 뛰는 경우 따로 loop를 돌리지 않고도 * 연산자를 통해서 구분이 가능하다.


#Scanner를 이용해서 파일 내용 읽어오기

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.util.Scanner;



System.setIn(new FileInputStream("src\\com\\data\\Solution11.txt"));

경로명 설정해서 불러온다.

throws FileNotFoundException

파일 내용이 잘못될 수 있으니까 예외 처리를 해준다.

#Random 이용방법


import java.util.Random;

Random ran = new Random();

int a = ran.nextInt(45)+1 // ran 을 쓰면 기본 0부터 시작이다 그래서 보통은 +1 해줘서 내가 원하는 값 

Random의 중복을 제거하는 방법은 여러개가 있다. 배열을 하나 더 만들어서 값을 확인해 주는 방법도 있고, 그러지 않아도 j 변수를 이용해서 for문 안에 a[i]==a[j] 선언하고 조건이 충족하면 i--로 저장하지 않는다.

ex)

for(int i=0; i<array.length; i++) {

int x=ran.nextInt(10)+1; // 1~10까지의 값

array[i]=x;

for(int j=0; j<i; j++ ) {

if(array[i]==array[j]) {

i--;

}

}

}

# String => Int 로 형변환 Integer.parseInt(string)

int x = Integer.parseInt(args[0]);

int y = Integer.parseInt(args[1]);

주의할 점은 정수형으로 바뀌는 함수라서 문자열에 문자가 들어간 String은 바꿀수가 없다.

ex) String a ="12aa" //꼭 예외처리를 해줘야함

ex)

String a="11111";

String b="22222";

int x=Integer.parseInt(a);

int y=Integer.parseInt(b);

System.out.println(x+y);



#int => String 


int a =10;

String s = a+"";

int형인 a를 String 형인 s로 형변환 가능하다.






+ Recent posts