728x90

 

import java.io.*;
import java.util.*;
public class Main {
    static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
    static String s;

    static Set<String> set = new HashSet<>();

    public static void main(String[] args) throws IOException
    {
        s = bf.readLine();
        for (int i = 0; i < s.length(); i++) {
            dfs(i,i,String.valueOf(s.charAt(i)), "", "");
        }
        System.out.println(set.size());
    }

    public static void dfs(int left, int right, String newWay, String cur, String result)
    {
        result = result + cur + newWay;
        boolean canGoLeft = left - 1 < 0 ? false:true;
        boolean canGoRight = right + 1 > s.length()-1 ? false:true;
        if( !canGoLeft&&!canGoRight)
        {
            //System.out.println(result);
            set.add(result);

            return;
        }
        if(canGoLeft)
        {
            String news = String.valueOf(s.charAt(left-1));
            dfs(left - 1,right, news, cur + newWay, result);
        }
        if(canGoRight)
        {
            String news = String.valueOf(s.charAt(right+1));
            dfs(left,right+1, news,cur + newWay,result);
        }


    }
}
728x90

'JAVA' 카테고리의 다른 글

JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

java.base모듈은 모든 모듈이 의존하는 가장 기본적인 모듈이다.

 

java.base모듈의 패키지

Java의 기본적인 클래스들이 위치해 있다.

가장 많이 사용되는 패키지 : java.lang

 

Object 

모든 Java클래스들의 조상 클래스이다.

필드가 없고, 메서드로만 이루어져 있다.

  • toString()
    • Class 인스턴스를 토대로 문자열을 만들어 리턴한다.
    • 인스턴스의 모든 정보를 담도록 하는것이 좋다.
class CloneObj implements Cloneable
{
	...
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public static void main(String[] args)
{
    CloneObj clone1 = new CloneObj();
    
    CloneObj clone2 = clone1.clone();
}
  • clone()
    • 내부의 필드값을 복사하여 새로운 인스턴스를 생성하고 반환한다.
    • 이 메서드를 사용하기 위해선 클래스 선언 시에 Cloneable이라는 인터페이스를 준수하게 해야한다.
public boolean equals(Object obj)
{
	return this == obj;
}
  • equals(Object)
    • 단순히 인스턴스의 주소값을 비교한다.
  • hashCode()
    • 객체를 식별할 수 있는 하나의 정수를 리턴한다.
만약 equals()메서드를 통해 두 객체가 동등하다고 판단된 경우, 두 객체의 hashCode()메서드의 반환값은 같아야 한다.
따라서 이 두 메서드는 함께 사용되어야 하며, 일관성 있고 올바른 동등성 및 해시 처리를 위해 상호 작용해야 한다.
만약 equals()메서드를 오버라이드 한다면, hashCode()메서드도 오버라이드를 하여 일관성을 유지해야 한다.

String 

Java에서 문자열을 다루기 위한 class

불변(Immutable)의 속성을 가진다.

String str = "Hello my name is daehee"

str.equals("Hello my name is daehee"); // true
str.length(); // 23
str.indexOf("Hello"); // 0
str.indexOf("good"); //없으므르 -1 반환
str.toUpperCase(); // HELLO MY NAME IS DAEHEE
str.toLowerCase(); // hello my name is daehee
str.isEmpty(); // false;
str.contains("good"); // false

 

  • length()
    • 문자열의 길이를 반환한다.
  • indexOf(String) 
    • 문자열에서 String 문자열 매개변수의 인덱스를 반환한다.
    • 없으면 -1을 반환한다.
  • toUpperCase()
    • 문자열을 대문자로 바꿔서 반환한다.
  • toLowerCase()
    • 문자열을 소문자로 바꿔서 반환한다.
  • isEmpty()
    • 문자열이 비어있으면 true를 반환한다.
    • 아니면 false를 반환한다.
  • contains(String)
    • 문자열 안에 String 매개변수가 있는지 확인한다.

+ 로 문자열과 문자열을 합칠 수 있다.


 

Math

Wrapper

Enum

등등

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

원래는 static 키워드를 먼저 정리하려 했는데...

코드가 어떻게 돌아가는지는 알아야하니까..!

 

자바는 OS에 종속적이지 않다.

윈도우든, 맥이든, 리눅스든 운영체제에 구애받지 않는다.

 

그것을 가능하게 만들어 주는 것이 JVM이다.

JVM은 자바의 코드가 운영체제 위에서 돌아갈 수 있도록 바이트 코드 -> 기계어로 변환해주는 가상머신이다.

자바의 실행 과정

 

JVM의 구성요소

 

출처 : https://url.kr/nijx6q

클래스 로더

클래스를 처음 참조할 때 여러개의 클래스를 묶어서 한번에 메모리에 올린다!(링킹 + 로딩)

 

실행 엔진

작성한 코드가 운영체제에서 실행이 될 수 있도록 바이트 코드를 기계가 실행할 수 있는 형태로 변경한다!

  • 가비지 컬렉터
    • 동적으로 생성된 인스턴스들을 관리한다!
    • 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다!

런타임 데이터 공간

프로그램을 수행하기 위해 운영체제에게서 할당받은 메모리 공간!

JVM 스택 영역 메서드가 호출될 때 할당됨
Heap 영역 객체 생성 시 할당됨
Method Area 클래스 로더에서
클래스/인터페이스,
static 키워드 등이 저장됨

 

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

추상 메서드, 클래스는 왜 쓰는 것일까?

 

예제 먼저 보자.

package polymorphism;

class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    void bark() // 일반 오버라이딩
    {
        System.out.println("동물!동물!");
    } 
}

 

    package polymorphism;

    public class Dog extends Animal{
        public Dog(String name) {
            super(name);
        }

        @Override
        void bark() {
            System.out.println("왈왈");
        }
    }

 

과연 Animal의 bark메서드의 내용을 작성해야할까?

어차피 하위 클래스인 Dog에서 오버라이딩을 진행할 것이다.

그렇다면 bark 메서드를 써야한다고 명시 정도만 해주는 것은 어떨까?

 

그 개념이 바로 추상 메서드, abstract 키워드가 필요한 순간이다.

 

package polymorphism;

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void bark(); // 추상 메서드
}

상위 클래스에서 추상 메서드는 선언만 한다.

어차피 하위 클래스에서 오버라이딩 할거니까.

 

추상 메서드를 선언할 때엔 앞에 abstract 키워드를 꼭 넣어야 한다.

또한 클래스 선언할 때에도 추가해야 한다.

 

bark 메서드를 오버라이딩 하지 않으면 오류가 생김으로써 프로그래머가 더욱 안전하게 코드를 짤 수 있도록 도와준다!

 

 

또한 추상클래스 타입으로 인스턴스화는 불가하다.

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

오늘은 객체지향의 다형성 개념을 알아보았다.

 

다형성이 무엇일까?

구글에서는

다형성(polymorphism)이란? 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.

라고 정의하고 있다.

 

막상 다형성이라는 개념을 알아보니 잘 이해가 되지 않았다.

 

이 클래스 다이어그램을 보면 

상위 클래스 Animal을 상속 받는 하위 클래스 dog, cat, monkey가 있다.

 

dog 클래스는 Animal의 필드와 메서드를 그대로 갖고 있다.

그럼 과연 dog는 Animal이라고 할 수 있을까?

 

그렇다

이는 일상생활에서 찾아봐도 나오는 답이다.

개는 동물이다. 

하지만 동물이라고 개가 될 수는 없다.

동물이 개만 있는게 아니라 고양이가 될 수도, 원숭이가 될 수도 있기 때문이다.

 

그러면 위 구글이 정의한 다형성과 비교 및 정리 해보자

 

개는 개와 동물이라는 두가지의 타입을 갖을 수 있다. 또한 개를 동물이라고 부를 수도 있다. 

 

 

왜 다형성이 필요할까?

다형성은 "코드의 재사용성"이라는 장점을 가지고 있다.

위의 코드를 다형성 없이 작성한다면 dog, cat, monkey라는 클래스를 작성할 때 중복된 내용똑같이 작성해야 한다.

 

만약 중복된 내용이 엄청 많고, 그와중에 오류가 난다면? 머리 아프다.

하지만 중복된 내용을 하나의 클래스(Animal)로 정리함으로써 코드의 작성 시간간결함이 엄청나게 해소될 것이다.

 

또한 동물이라는 인스턴스를 모두 가져와야하는 상황이라면? 끔찍하다.

dog... cat... monkey... 정의된 동물 클래스만큼의 타입을 싸그리 모아서 가져와야 한다.

이 또한 중복된 내용으로 정리된 하나의 클래스(Animal)로써 정리될 수 있다. 

왜? 개도 동물이고, 고양이도 동물이고, 원숭이도 동물이니까. Animal의 타입만을 가져와도 된다.

 

 

코드로 정리해보자

- Animal class

package polymorphism;

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void bark(); // 추상 메서드
}

 

 

 

- Dog class

    package polymorphism;

    public class Dog extends Animal{
        public Dog(String name) {
            super(name);
        }

        @Override
        void bark() {
            System.out.println("왈왈");
        }
    }

- Cat class

package polymorphism;

public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("냐옹");
    }
}

- Monkey class

package polymorphism;

public class Monkey extends Animal{
    public Monkey(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("우끼끼");
    }
}
728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12

+ Recent posts