Sad Puppy 3 개발자 아지트 :: 개발자 아지트

do-while문 구조

조건에 만족하지 않아도 한번은 코드를 처한다. 

더보기

do {

    // 코드

} while (조건식);

 

Continue

while(조건식){
	코드1;
    continue; // 즉시 조건식으로 이동한다. 
    코드2;
}

 

continue를 만날경우 즉시 조건식으로 가서 조건을 확인한다. 

 

향상된 for문 == for each

 

for(타입 변수명: 배열명) {
	System.out.println(변수명); // 예시, 배열의 원소를 출력함
}

'Java > Java입문' 카테고리의 다른 글

사용자 입력  (1) 2024.07.05
스코프(변수의 접근 가능 범위), 형변환  (0) 2024.07.05
조건문  (0) 2024.07.05
연산자  (0) 2024.07.05
자바 자료구조 구현 - 큐, ArrayDeque  (0) 2024.03.08

 

기본 형태

public class test{
	public static void main(String[] args){
    int a = 19;
    
    if (a == 1) {
    	// 필요한 코드
    } else if (a == 2) {
    	// 필요한 코드
    } else{
    	// 필요한 코드
    }   
    }

}

 

 

if문의 명령이 한개만 있어도 가독성이나 유지보수성을 고려했을때 중괄호를 사용하는것이 좋다. 

 

 

자바 14이상의 새로운 case문 

public class test{
	public static void main(String[] args){
    int a = 1;
    
   	int ticket = switch (a){
    	case 1 -> 100;
        case 2 -> 200;
        case 3 -> 300;
        default -> 500;
    };
    
    System.out.println(ticket); // 100 출력
    
    }
}

 

 

삼항 연산자 == 조건 연산자 

public class test{
	public static void main(String[] args){
    int a = 19;
    
   	String result = (a>=19) ? "네" : "아니오"; // result는 "네" 가됨
}

'Java > Java입문' 카테고리의 다른 글

스코프(변수의 접근 가능 범위), 형변환  (0) 2024.07.05
반복문  (0) 2024.07.05
연산자  (0) 2024.07.05
자바 자료구조 구현 - 큐, ArrayDeque  (0) 2024.03.08
자바 자료구조 구현 - 배열, ArrayList(리스트)  (0) 2024.03.08

 

문자열 비교

 

문자열을 비교할 때는 .equals() 메서드를 사용한다.

만약 ==을 사용할 경우 실패할 경우가 발생할 수 있기때문이다. 

 

public class Test1{
	public static void main(String[] args){
    	String str1 = "hi";
        String str2 = "hello";
        
        boolean result = "hello".equals("hello"); // 리터럴 비교, true
        boolean result1 = str1.equals("hi");		// true
        boolean result2 = str1.equals(str2);		// false
    	
    }
}

 

문장 완성 단축키 : ctrl+ shift+ enter

 

논리 연산자

  • &&: 두개의 피연산자가 모두 참이면 true를 반환, 둘 중 하나라도 거짓이면 false
  • ||: 두개의 피연산자중 하나라도 참이면 true를 반환, 둘 다 모두 거짓이면 false

 

삼항 연산자:  ? :

 

 

instanceof 연산자 

  • 객체의 타입을 반환한다. 

 

비트 연산자

  • 실무에서 사용할 일이 거의 없음. 그때그때 찾아보면 

 

'Java > Java입문' 카테고리의 다른 글

반복문  (0) 2024.07.05
조건문  (0) 2024.07.05
자바 자료구조 구현 - 큐, ArrayDeque  (0) 2024.03.08
자바 자료구조 구현 - 배열, ArrayList(리스트)  (0) 2024.03.08
자바 필수 문법 정리  (0) 2024.03.08

1. DOM(Document Object Model)

DOM은 Document Object Model의 약자로, 웹 페이지의 구조화된 표현을 제공하는 인터페이스이다.

HTML이나 XML 문서의 각 요소에 접근하고 조작할 수 있는 방법을 제공한다.

  • 개념: 웹 페이지를 논리적인 트리 구조로 표현한 모델이고, 각 HTML 요소는 DOM 노드로 표현된다
  • 사용: JavaScript를 사용하여 DOM에 접근하고 수정할 수 있으며, 이를 통해 동적으로 웹 페이지를 변경할 수 있다.

2. localStorage와 JSON 활용

localStorage

localStorage는 클라이언트 측에서 데이터를 장기간 저장할 수 있는 메커니즘이다.
이를 통해 사용자의 로컬 브라우저에 데이터를 저장하고, 세션이나 페이지가 새로고침되어도 데이터를 유지할 수 있다.

  • 사용: localStorage.setItem('key', 'value')로 데이터를 저장하고, localStorage.getItem('key')로 데이터를 가져올 수 있다.

JSON (JavaScript Object Notation)

JSON은 JavaScript의 객체 표기법을 기반으로 하는 경량 데이터 교환 형식이다. 

JavaScript 객체를 문자열로 변환하거나, 문자열을 다시 JavaScript 객체로 파싱하는 데 사용된다.

  • 사용: JSON.stringify()는 JavaScript 객체를 JSON 문자열로 변환한다. 
  • JSON.parse()는 JSON 문자열을 JavaScript 객체로 파싱한다.

3. 이벤트 핸들러 (Event Handler)

이벤트 핸들러는 특정한 이벤트가 발생했을 때 실행할 JavaScript 코드를 정의하는 함수이다.

  • 사용: HTML 요소에 이벤트 핸들러를 추가하여 사용자 상호작용에 반응하도록 할 수 있다.
  • 예를 들어, 버튼 클릭(onclick), 키 입력(onkeydown), 마우스 이동(onmousemove) 등 다양한 이벤트를 감지할 수 있다.

4. JavaScript에서의 동적 DOM 조작

JavaScript를 사용하여 DOM을 동적으로 조작할 수 있다.

예를 들어, 새로운 요소를 생성하거나 기존 요소를 수정하고 삭제할 수 있다.

  • DOM 생성: document.createElement()로 새로운 요소를 생성한다
  • 요소 추가: parentNode.appendChild()로 요소를 부모 요소에 추가한다.
  • 속성 설정: element.setAttribute()로 요소의 속성을 설정한다.
  • 텍스트 삽입: element.textContent로 요소에 텍스트 내용을 추가하거나 수정한다.

진도(1/10)

 

 

 

java.util 패키지

java.util패키지는 유용한 클래스들을 많이 가지고 있는 패키지

  • 날짜와 관련된 클래스인 Date, Calendar클래스
  • 자료구조와 관련된 컬렉션 프레임워크와 관련된 인터페이스와 클래스
  • deprecated란 더이상 지원하지 않으니 사용하지 않는 것이 좋다란 의미다.
  • Date클래스는 지역화를 지원하지 않는다. 지역화란 국가별로 현재 날짜와 시간은 다를 수 있는데, 그 부분을 지원하지 못한다.
  • 이런 문제를 해결하기 위하여 나온 클래스가 Calendar클래스. Calendar클래스는 자바 1.1에 등장하였다.
  • 지역화와 관련된 클래스들은 Locale로 시작되는 이름을 가진 클래스들입니다. 역시 1.1 이후에 등장한다.
  • List, Set, Collection, Map은 자료구조 즉 컬렉션 프레임워크와 관련된 인터페이스

 

진도(2/10)

 

컬렉션 프레임워크

 

프로그래밍을 잘 하기위해서는 이건 꼭 알아야

 

java.util패키지에는 자료를 다룰 수 있는 자료구조 클래스가 다수 존재합니다.
자료구조 클래스들을 컬렉션 프레임워크라고 한다.

  • 자료구조란 자료를 저장할 수 있는 구조
  • 책을 보관하기 위해서 책장을 이용하는 것처럼 다양한 자료들을 다양한 방식으로 관리하기 위한 방법이 필요한데, 이러한 방법을 제공하는 것을 자료구조, 컬렉션 프레임워크이다.
  • 컬렉션 프레임워크에서 가장 기본이 되는 interface는 Collection인터페이스
    • Collection인터페이스는 여기에 자료가 있다라는 것을 표현.
    • 중복도 허용하고, 자료가 저장된 순서도 기억하지 못하는 것이 Collection인터페이스.
    • Collection이 가지고 있는 대표적인 메소드는 add()-자료추가, size()-저장된 자료 크기, iterator()-자료꺼내기위한 메소드
    • Collection은 저장된 순서를 기억하지 못하기 때문에 "첫번째 자료를 달라, 두번째 자료를 달라"와 같은 기능을 가질 수 없다. * * Collection은 저장된 자료를 하나씩 하나씩 꺼낼 수 있는 Iterator라는 인터페이스를 반환한다.
      • Iterator는 꺼낼것이 있는지 없는지 살펴보는 hasNext()메소드하나씩 자료를 꺼낼때 사용하는 next()메소드를 가지고 있다.
  • Set자료구조는 중복을 허용하지 않는 자료구조를 표현하는 인터페이스
    • Collection인터페이스를 상속받는다.
    • Set인터페이스가 가지고 있는 add메소드는 같은 자료가 있으면 false, 없으면 true를 반환하는 add메소드를 가지고 있다.
  • List자료구조는 중복은 허용하면서 순서를 기억하는 자료구조를 표현.
    • Set인터페이스와 마찬가지로 Collection인터페이스를 상속받고 있다.
    • List는 순서를 기억하고 있기 때문에 0번째 1번째 n번째의 자료를 꺼낼 수 있는 get(int)메소드를 가지고 있다.
  • Map자료구조는 Key와 Value를 가지는 자료구조이다.
    • 저장할 때 put()메소드를 이용하여 key와 value를 함께 저장한다.
    • 원하는 값을 꺼낼때는 key를 매개변수로 받아들이는 get()메소드를 이용하여 값을 꺼낸다.
    • Map에 저장되어 있는 모든 Key들은 중복된 값을 가지면 안된다.
    • Key의 이런 특징 때문에 Map은 자신이 가지고 있는 모든 Key들에 대한 정보를 읽어들일 수 있는 Set을 반환하는 keySet()메소드를 가지고 있다.

 

진도(3/10)

 

Generic

 

 

Box 클래스

    public class Box {
        private Object obj;
        public void setObj(Object obj){
        this.obj = obj;
        }

        public Object getObj(){
        return obj;
        }
    }

BoxExam 클래스

    public class BoxExam {
        public static void main(String[] args) {
            Box box = new Box();
            box.setObj(new Object());
            Object obj = box.getObj();

            box.setObj("hello");
            String str = (String)box.getObj();
            System.out.println(str);

            box.setObj(1);
            int value = (int)box.getObj();
            System.out.println(value);
        }
    }
  • Box는 매개변수로 Object를 하나 받아들이고, Object를 반환한다.
  • Object를 받아들일 수 있다는 것은 Object의 후손이라면 무엇이든 받아들일 수 있다는 것이다.

Java5에는 Generic이라는 문법이 사용됨으로써 인스턴스를 만들때 사용하는 타입을 지정하는 문법이 추가

Generic을 이용하여 Box 클래스 수정

    public class Box<E> {
        private E obj;
        public void setObj(E obj){
            this.obj = obj;
        }

        public E getObj(){
            return obj;
        }
    }
  • 클래스 이름 뒤에 <E>가 제네릭을 적용한 것이다. Box는 가상의 클래스 E를 사용한다는 의미.
  • Object를 받아들이고, 리턴하던 부분이 E로 변경. E는 실제로 존재하는 클래스는 아니다.

Generic을 이용하여 수정한 Box를 이용하는 BoxExam클래스

    public class BoxExam {
        public static void main(String[] args) {
            Box<Object> box = new Box<>();
            box.setObj(new Object());
            Object obj = box.getObj();

            Box<String> box2 = new Box<>();
            box2.setObj("hello");
            String str = box2.getObj();
            System.out.println(str);

            Box<Integer> box3 = new Box<>();
            box3.setObj(1);
            int value = (int)box3.getObj();
            System.out.println(value);
        }
    }
  • 참조타입에 <Object> , <String>, <Integer>가 있는 것을 볼 수 있다.
  • 첫번째는 Object를 사용하는 Box를 인스턴스로 만들겠다는 의미
  • 두번째는 String을 사용하는 Box인스턴스를 만들겠다는 의미
  • 세번째는 Integer를 사용하는 Box인스턴스를 만든다는 의미

Generic을 사용함으로써 선언할때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있습니다. Generic을 사용하는 대표적인 클래스는 컬렉션 프레임워크와 관련된 클래스입니다.

 

진도(4/10)

 

Set

 

 

 

set은 중복이 없고, 순서도 없는 자료구조. Hashset과 TreeSet이 있다.

    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;

    public class SetExam {
        public static void main(String[] args) {
            Set<String> set1 = new HashSet<>();

            boolean flag1 = set1.add("kim");
            boolean flag2 = set1.add("lee");
            boolean flag3 = set1.add("kim");

            System.out.println(set1.size());   //저장된 크기를 출력합니다. 3개를 저장하였지만, 이미 같은 값이 있었기 때문에 2개가 출력
            System.out.println(flag1);  //true
            System.out.println(flag2);  //true
            System.out.println(flag3);  //false

            Iterator<String> iter = set1.iterator();

            while (iter.hasNext()) {   // 꺼낼 것이 있다면 true 리턴.          
                String str = iter.next(); // next()메소드는 하나를 꺼낸다. 하나를 꺼내면 자동으로 다음것을 참조한다.
                System.out.println(str);
            }
        }
    }

 

진도(5/10)

 

실습

 

참고: set의 내용은 for each문 또는 Iterator를 활용해서 출력할 수 있습니다. for each문을 복습하려면 이 링크를 참고하세요.

 

 

진도(6/10)

 

실습 

 

진도(7/ 10)

 

List

 

 

list는 데이터의 중복이 있을 수 있고, 순서도 있다.

    import java.util.ArrayList;
    import java.util.List;

    public class ListExam {

        public static void main(String[] args) {
            List<String> list = new ArrayList<>();

            // list에 3개의 문자열을 저장합니다.
            list.add("kim");
            list.add("lee");
            list.add("kim");

            System.out.println(list.size()); //list에 저장된 자료의 수를 출력 (중복을 허용하므로 3 출력) 
            for(int i = 0; i < list.size(); i++){
                String str = list.get(i);
                System.out.println(str);
            }
        }   
    }

 

진도(8/ 10)

 

실습

 

진도(9/10)

 

Map

 

 

Map은 key와 value를 쌍으로 저장하는 자료구조 키는 중복될 수 없고, 값은 중복될 수 있다.

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;   
    public class MapExam {  
        public static void main(String[] args) {
            // Key, Value가 모두 String 타입인 HashMap인스턴스를 만듭니다.
            Map<String, String> map = new HashMap<>();

            // key와 value값을 put으로 저장합니다.
            map.put("001", "kim");
            map.put("002", "lee");
            map.put("003", "choi");
            // 같은 key가 2개 있을 수 없습니다. 첫번째로 저장했던 001, kim은 001, kang으로 바뀐다.
            map.put("001", "kang");

            // map에 저장된 자료의 수를 추력합니다. 3이 출력됩니다.
            System.out.println(map.size());

            // 키가 001, 002, 003인 값을 꺼내 출력합니다.
            System.out.println(map.get("001"));
            System.out.println(map.get("002"));
            System.out.println(map.get("003"));

            // map에 저장된 모든 key들을 Set자료구조로 꺼냅니다.
            Set<String> keys = map.keySet();
            // Set자료구조에 있는 모든 key를 꺼내기 위하여 Iterator를 구합니다.
            Iterator<String> iter = keys.iterator();
            while (iter.hasNext()) {
                // key를 꺼냅니다.
                String key = iter.next();
                // key에 해당하는 value를 꺼냅니다.
                String value = map.get(key);
                // key와 value를 출력합니다.
                System.out.println(key + " : " + value);
            }
        }
    }

 

진도(10/10)

 

실습

 

 

 

'Java > Java중급' 카테고리의 다른 글

파트2. java.lang 패키지 (8 / 8)  (0) 2024.06.24
파트1. Object 클래스 (2 / 2)  (0) 2024.06.24

진도(1/8)

java.lang 패키지/오토박싱

 

 

자바는 기본적으로 다양한 패키지를 지원한다.  그중에서 가장 중요한 패키지

  • java.lang패키지의 클래스는 import를 하지 않고도 사용할 수 있다.
  • java.lang패키지에는 기본형타입을 객체로 변환시킬때 사용하는 Wrapper클래스가 있다.
    • Boolean, Byte, Short, Integer, Long, Float, Double 클래스
  • 모든 클래스의 최상위 클래스인 Object도 java.lang패키지
  • 문자열과 관련된 String, StringBuffer, StringBuilder도 모두 java.lang패키지
  • 화면에 값을 출력할때 사용했던 System클래스도 java.lang패키지
  • 수학과 관련된 Math클래스도 java.lang패키지
  • Thread와 관련된 중요 클래스들이 java.lang패키지
  • 이외에도 다양한 클래스와 인터페이스가 java.lang패키지에 속해 있다.
    public class WrapperExam {
        public static void main(String[] args) {
            int i = 5; 
            Integer i2 = new Integer(5);
            Integer i3 = 5;     //오토박싱
            int i4 = i2.intValue();
            int i5 = i2;       //오토언박싱
        }
    }
  • 오토박싱(Auto Boxing)
    • Integer i3 = 5; 숫자 5는 원래 기본형이지만 자동으로 Integer형태로 변환된다.
  • 오토 언박싱(Auto unboxing)
    • int i5 = i2; Integer객체타입의 값을 기본형 int로 자동으로 변환되어 값을 할당한다.
  • 오토박싱(Auto Boxing),오토 언박싱(Auto unboxing) 은 JAVA 5부터 지원한다. 이 때 내부적으로 Wrapper클래스들이 사용된다.

 

진도(2/8)

 

실습

 

진도(3/8)

 

스트링버퍼

 

 

아무 값도 가지고 있지 않은 StringBuffer객체를 생성

    StringBuffer sb = new StringBuffer();
    // 해당 스트링 버퍼에 "hello", 공백, "world"를 차례대로 추가

    sb.append("hello");
    sb.append(" ");
    sb.append("world");
    // StringBuffer에 추가된 값을 toString()메소드를 이용하여 반환

    String str = sb.toString();
  • 출력결과 : hello world

StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환

    StringBuffer sb2 = new StringBuffer();
    StringBuffer sb3 = sb2.append("hello");
    if(sb2 == sb3){
        System.out.println("sb2 == sb3");
    }
  • 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.
  • StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.
        String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
        System.out.println(str2);
  • 앞에서 5줄로 작성했던 코드를 위와 같이 한 줄로 수정할 수 있습니다.
  • StringBuffer는 append메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있습니다.


진도(4/8)

 

실습

 

진도(5/8)

 

스트링 클래스의 문제점

 

 

String클래스는 문자열을 다룰때 사용하는 클래스

String클래스는 불변클래스 이다.

        String str1 = "hello world";
        String str2 = str1.substring(5);
        System.out.println(str1);
        System.out.println(str2);
  • 실행결과
    hello world
     world
  • 기존의 str1은 전혀 변화 없다.
  • substring메소드는 5번째 부터 문자열을 잘라서 새로운 문자열을 반환하는 메소드
  • str1자체는 전혀 변화가 없다.

String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 입니다.

    String str3 = str1 + str2;
    System.out.println(str3);
  • 실행결과
    hello world world

문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행

    String str4 = new StringBuffer().append(str1).append(str2).toString();
    System.out.println(str4);

문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하도록 합시다.

 

진도(6/8)

 

실습

 

 

문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피해야 합니다.

 

 

진도(7/8)

 

Math

 

 

Math클래스는 이름 그대로 수학계산을 위한 클래스

코싸인, 싸인, 탄젠트, 절대값, 랜덤값을 구할 수 있는 클래스

  • Math클래스는 생성자가 private으로 되어 있기 때문에 new 연산자를 이용하여 객체를 생성할 수 없다.
  • 객체를 생성할 수는 없지만 모든 메소드와 속성이 static으로 정의되어 있기 때문에 객체를 생성하지 않고도 사용할 수 있다.
    public class MathExam {
        public static void main(String[] args) {
            int value1 = Math.max(5, 20);
            int value2 = Math.min(5, -5);
            int value3 = Math.abs(-10);
            double value4 = Math.random();
            double value5 = Math.sqrt(25);  
        }
    }


진도(8/8)

 

 

 

 

'Java > Java중급' 카테고리의 다른 글

파트3. java.util 패키지 (10 / 10)  (0) 2024.06.24
파트1. Object 클래스 (2 / 2)  (0) 2024.06.24

진도(1/2)

 

Object와 오버라이딩

 

 

  • Object클래스는 모든 클래스의 최상위 클래스
  • 아무것도 상속받지 않으면 자동으로 Object를 상속
  • Object가 가지고 있는 메소드는 모든 클래스에서 다 사용할 수 있다는 것을 의미
  • Object가 가진 메소드 
    • equals 객체가 가진 값을 비교할 때 사용
      • 비교할 기준은 프로그래머가 정해주면 됨
      • menu-> Source->Generate equals()
    • toString 객체가 가진 값을 문자열로 반환
    • hashCode 객체의 해시코드 값 반환
  • 위의 메소드는 사용자가 알맞게 오버라이딩 해서 사용해야함

 

 

진도(2/2)

 

'Java > Java중급' 카테고리의 다른 글

파트3. java.util 패키지 (10 / 10)  (0) 2024.06.24
파트2. java.lang 패키지 (8 / 8)  (0) 2024.06.24

 

SELECT문의 기본 형식

 

SELECT 열_이름
	FROM 테이블_이름
	WHERE 조건식 (WHERE문을 작성하지 않으면 모든 항목을 조회함)
	GROUP BY 열_이름
	ORDER BY 열_이름 (어떤 열을 기준으로 정렬할 것인지, ASC(오름차순), DESC(내림차순) 
	LIMIT 숫자 (출력 하고싶은 값의 개수를 제한하고 싶을때 사용)

 

이때 가장 중요한 것은 쿼리문을 작성할때 필요없는 쿼리문을 생략할 수는 있어도, 위의 순서대로 쿼리문을 작성해야 오류가 발생하지 않는다. 

 

만약 정렬할 값이 여러값일때, 작성한 열 이름 순서대로 우선순위를 따라 정렬하게 된다. 

또한 예를들어서 첫번째 값이 동일한 경우 두번째 값의 정렬기준에 따라 정렬하게된다. (두번째 값 마저 동일할 경우 세번째 값의 정렬기준에 따라 정렬하고, 이후의 값들이 있을경우 마찬가지로 적용됨)

 

 

WHERE 절 NOTNULL 예시

SELECT 열_이름
	FROM 테이블_이름
	WHERE 칼럼명 IS NOT NULL

 

 

 

WHERE 절 NULL 예시

SELECT 열_이름
	FROM 테이블_이름
	WHERE 칼럼명 IS NULL # 조건이 여러개인 경우, AND를 통해 조건을 추가 작성한다.

 

 

 

NULL 및 NOT NULL을 다룰 때 주의할 점 

NULL은 값이 아니라서 비교문(=, <, >, <>)의 사용이 불가하다. 

NULL은 상태이다. 

 

 

CASE문(조건문)

SELECT를 통해 출력할 값에 대해서 특정 조건을 만족할 경우, 출력 값을 변경하고싶을때 사용한다. 

 

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS
        , CASE WHEN FREEZER_YN IS NULL THEN 'N' 
        ELSE FREEZER_YN 
        END AS FREEZER_YN
        FROM FOOD_WAREHOUSE

 

CASE문 사용시 ELSE문을 생략하게되면, WHEN조건에 걸리지 않는 경우 NULL 상태로 처리한다. 

CASE문은 반드시 END로 끝내야하고, 조건문과 조건문 사이에는 콤마를 사용하지 않는다. 

결과 부분에 NULL을 사용하지 않는다. 

 

END뒤에 붙은 AS는 Alias의 약어로, 별칭을 의미한다. 해당 조건문을 통해 추려진 값들은 AS뒤에 있는 값이 컬럼명이 되어 출력된다. (별칭을 사용하지 않으면 쿼리문이 그대로 출력된다. )

 

 

조회한 후 결과에 출력된 행의 수 반환하기

count(*) 함수를 통해 해당 출력할 수 있다. 만약, 해당 값에 대한 칼럼 이름을 변경하고싶다면 뒤에 as를 붙여 적용한다. 

 

SELECT COUNT(*) AS USERS
FROM USER_INFO 
    WHERE AGE IS NULL

 

 

데이터(날짜)형식 변경

 

DATE_FORMAT함수를 통해 데이터 형식을 변경한다. 

첫번째 인자에는 변경하고 싶은 대상 데이터를 입력한다. 

두번째 인자에는 변경하려는 데이터형식을 설정해준다. 

 

변경후 해당 데이터에 대한 컬럼명을 AS를 통해 지정해줘야한다. 

 

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
    FROM DOCTOR
    WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
    ORDER BY HIRE_YMD DESC, DR_NAME

 

데이터 형식은 다음과 같다. 

(펼쳐서 확인)

 

더보기

 

format 설명
%a 축약된 요일 이름 (일요일부터 토요일까지)
%b 축약된 월 이름 (1월부터 12월까지)
%c 숫자로 표시된 월 이름 (0부터 12까지)
%D 일(day)을 숫자로 표시하고 접미사를 붙임 (1일, 2일, 3일 등)
%d 일(day)을 숫자로 표시 (01부터 31까지)
%e 일(day)을 숫자로 표시 (0부터 31까지)
%f 마이크로초 (000000부터 999999까지)
%H 시간(hour) (00부터 23까지)
%h 시간(hour) (00부터 12까지)
%I 시간(hour) (00부터 12까지)
%i 분(minutes) (00부터 59까지)
%j 연(year)의 몇 번째 일(day)인지 (001부터 366까지)
%k 시간(hour) (0부터 23까지)
%l 시간(hour) (1부터 12까지)
%M 전체 월 이름 (1월부터 12월까지)
%m 숫자로 표시된 월 이름 (00부터 12까지)
%p 오전(AM) 또는 오후(PM)
%r 12시간 형식으로 표시된 시간 (hh:mm:ss 오전/오후)
%S 초(seconds) (00부터 59까지)
%s 초(seconds) (00부터 59까지)
%T 24시간 형식으로 표시된 시간 (hh:mm:ss)
%U 일요일을 한 주의 첫 번째로 하는 주차 (00부터 53까지)
%u 월요일을 한 주의 첫 번째로 하는 주차 (00부터 53까지)
%V 일요일을 한 주의 첫 번째로 하는 주차 (01부터 53까지). %X와 함께 사용됨
%v 월요일을 한 주의 첫 번째로 하는 주차 (01부터 53까지). %x와 함께 사용됨
%W 전체 요일 이름 (일요일부터 토요일까지)
%w 일요일=0, 토요일=6인 요일
%X 일요일을 한 주의 첫 번째로 하는 주의 연도. %V와 함께 사용됨
%x 월요일을 한 주의 첫 번째로 하는 주의 연도. %v와 함께 사용됨
%Y 4자리 숫자로 표시된 연도
%y 2자리 숫자로 표시된 연도

 

 

 

 

값이 특정 문자열을 포함하는지 확인

 

와일드 카드(%)를 사용하여 특정 문자열이 포함되는지 확인한다. 

예를들어서, (미술학원, 피아노학원, 집앞학교) 에서 학원만 뽑아서 확인하고 싶다면

'%학원' 이렇게 작성하여 확인한다. 

 

(빨간집, 빨간코, 빨간뚜껑, 빨간책, 파란색연필, 파란하늘, 파란종이)에서 빨간 것들만 뽑아서 확인하고 싶다면

'빨간%' 이렇게 작성하여 확인한다. 

 

특정 문자열이 포함되며, 해당 문자열 앞뒤로는 어떤 문자가 오거나 오지않아도 상관없다면

'%특정문자%' 이렇게 작성하여 확인한다. 

 

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
    FROM FOOD_FACTORY
    WHERE ADDRESS LIKE '강원도%'
    ORDER BY FACTORY_ID

 

 

특정 칼럼의 평균 구하기

 

AVG(컬럼 명)라는 함수를 이용한다. 

 

 

소수점 아래 버리기

 

FLOOR()라는 함수를 이용한다. 

 

SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
    FROM CAR_RENTAL_COMPANY_CAR
    WHERE CAR_TYPE='SUV'

 

소수점 아래 특정자리수 까지만 출력하기

 

ROUND(표현하고자하는 값, 소수점 아래 출력하고자 하는 자릿수)라는 함수를 이용한다. 

 

SELECT ROUND(AVG(CASE WHEN LENGTH IS NULL THEN 10 ELSE LENGTH END), 2) AS AVERAGE_LENGTH
    FROM FISH_INFO

 

 

두 테이블 사이에 외래키가 존재하는 경우, 두 테이블의 조건을 통해 값을 뽑고 싶은 경우

 

JOIN, ON 구문을 사용한다. 

 

SELECT FIRST_HALF.FLAVOR # 기준이 되는 테이블의 칼럼
    FROM FIRST_HALF # 첫 번째 테이블
    JOIN ICECREAM_INFO # 참고할 테이블 
    ON FIRST_HALF.FLAVOR = ICECREAM_INFO.FLAVOR # 외래키로 묶여있는 컬럼, 조인 조건
    WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = 'fruit_based'
    ORDER BY TOTAL_ORDER DESC

 

 


테이블의 모든 정보를 출력하고싶은 경우

 

SELECT 문에서 *을 사용한다.  (이때 *은 모든 열을 의미한다)

 

SELECT *
    FROM ANIMAL_INS
    ORDER BY ANIMAL_ID

 

 

테이블의 특정 컬럼에서 Max값을 찾고 싶은경우

 

SELECT 문에서 MAX(대상)을 사용한다. 

 

 

출력하고자 하는 컬럼 값에 문자를 추가하고 싶은 경우

 

SELECT 문에서 CONCAT(대상, 추가할 문자열)을 사용한다. 

 

SELECT CONCAT(MAX(LENGTH), 'cm') AS MAX_LENGTH
    FROM FISH_INFO

 

 

날짜도 정렬이 가능하다

 

날짜도 계산이 가능하다

 

날짜2>=날짜1이라고 했을때, DATEDIFF(.날짜2, 날짜1) 를 하면 차이 일수가 리턴된다. 

중요한 점은 예를들어서, DATEDIFF(2,1)을 했을때 1이 리턴되지 않고, 2가 리턴된다는 점이다. 

날짜 수로 보면 1이라고 생각할 수 있지만, 여기서는 1일부터 2일까지 총 이틀 빌린 것으로 계산한다. 

 

 

비트연산도 가능하다

 

SELECT COUNT(*) AS "COUNT"
    FROM ECOLI_DATA
    WHERE ((GENOTYPE & 1) OR (GENOTYPE & 4)) AND !(GENOTYPE & 2)

 

 


SQL 구문 순서

 

SELECT 컬럼명
    FROM 테이블명
    WHERE 테이블 조건
    GROUP BY 컬럼명 
    HAVING 그룹 조건
    ORDER BY 컬럼명

 

WHERE 조건을 통해 나온 결과를 GROUP BY  문으로 묶어 그룹을 만들 수 있고,

 

해당 그룹을 HAVING을 통해 조건에 맞게끔 그룹을 다시 만든다. 

 

SELECT NAME, COUNT(*) AS COUNT 
    FROM ANIMAL_INS 
    WHERE NAME IS NOT NULL
    GROUP BY NAME # 컬럼 명 
    HAVING COUNT(*) >= 2 # 그룹 조건
    ORDER BY NAME

 

 

같은 값을 가진 행끼리 하나의 그룹으로 모우기

 

GROUP BY를 사용하여 데이터를 그룹화 한다. 

이 말은, 예를들어서 아래와 같은 표에 대해서 GROUP BY를 사용하면

과일 이름 개수
딸기  3
토마토 1
딸기 3

(사용전)

 

 

과일 이름 개수
딸기  6
토마토 1

(사용후)

 

이렇게 된다는 의미이다. 

 

 

특정 열에서 중복제거를 한 후, 행의 수를 반환하기

 

COUNT내부에서 DISTINCT를 추가한다. 

COUNT(DISTINCT 컬럼명)

 

SELECT COUNT(DISTINCT NAME) AS COUNT
    FROM ANIMAL_INS
    WHERE NAME IS NOT NULL

 

 

문자열 자르기  

 

문자열을 자르기 위해 SUBSTRING(문자열, 시작위치, 길이) 함수를 사용할 수 있다. 이 함수는 문자열 내에서의 시작위치에서부터 길이 만큼 문자열을 잘라내어 반환하는 함수이다. 


문자열을 자르기 위해 LEFT(문자열, 길이) 함수를 사용할 수 있다. 이 함수는 문자열에서 왼쪽에서부터 길이만큼 문자열을 잘라내어 반환하는 함수이다. 


문자열을 자르기 위해RIGHT(문자열, 길이) 함수를 사용할 수 있다. 이 함수는 문자열에서 오른쪽에서부터 길이만큼 문자열을 잘라내어 반환하는 함수이다. 

 

SELECT SUBSTRING(PRODUCT_CODE, 1, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS 
    FROM PRODUCT
    
    GROUP BY SUBSTRING(PRODUCT_CODE, 1, 2)
    
    ORDER BY PRODUCT_CODE

 

 

 AS로 만든 이름의 컬럼을 기준으로 정렬하기 

 

ORDER BY에는 SELECT에서 AS로 만든 별칭의 컬럼명을 넣어 정렬할 수 있다. 

단, 컬럼명을 쌍따옴표로 묶으면 안된다. 

 

SELECT MCDP_CD AS "진료과코드" , COUNT(*) AS "5월예약건수"
    FROM APPOINTMENT
    WHERE APNT_YMD LIKE "2022-05%"
    GROUP BY MCDP_CD
    ORDER BY 5월예약건수, 진료과코드

 

 

특정 컬럼의 총합 구하기

 

SUM(컬럼명)함수를 통해 특정 컬럼의 합을 구할 수 있다. 

 

SELECT SUM(PRICE) AS "TOTAL_PRICE"
    FROM ITEM_INFO
    WHERE RARITY LIKE "LEGEND"

 

 

'DB > SQL(MySQL)' 카테고리의 다른 글

MySQL 동작 방식, SQL  (0) 2025.07.24

https://www.acmicpc.net/problem/22232

 

 

문제설명

 

 

가희는 jo_test 폴더에 들어와 있습니다. 가희는 jo_test에 있는 파일 N개를 아래 기준에 따라 정렬하려고 합니다.

  1. 파일명 (FILENAME) 사전순으로
  2. 파일명 (FILENAME)이 같다면 가희가 설치한 OS에서 인식하는 확장자가 붙은 것이 먼저 나오게
  3. 1과 2로도 순서를 결정할 수 없다면, 파일 확장자 (EXTENSION) 사전 순으로

파일 N개를 문제에서 설명하는 정렬 기준에 따라 정렬해 주세요. 사전순의 기준은 아스키 코드 순입니다.



 

문제 해결 방법

 

이름, 확장자 순으로 sorted 함수에서 lambda를 통해 키를 설정후 정렬했다. 

 

이 과정에서 이름이 같은 값 중에서 확장자가 없것에 대해서 (확장자 없는 이름, 확장자 있는 이름) 순일 경우에만 확장자 없는 이름을 확장자 있는 이름 뒤로 자리를 바꿔줬다. 이 조건이 아닐경우, 정렬이 흐트러질 수 있기때문이다. 

 

 


코드 구현

 

 

import sys
input = sys.stdin.readline

N, M = map(int, input().split())

name = [input().rstrip() for _ in range(N)]
extent = set(input().rstrip() for _ in range(M))

tmpValue = []
for value in name:
    tmpValue.append(value.split('.'))
#print(extent)


tmpValue = sorted(tmpValue, key = lambda x: (x[0], x[1]))
# sorted함수에 key를 lambda함수로 정해줬다. 

#print('tmpValue', tmpValue)

for i in range(N-1):
    if tmpValue[i][0] == tmpValue[i+1][0]:
        if tmpValue[i][1] not in extent and tmpValue[i+1][1] in extent:
            tmp = tmpValue[i]
            tmpValue[i] = tmpValue[i+1]
            tmpValue[i+1] = tmp
        
#print('tmpValue', tmpValue)


for i in tmpValue:
    #strr, extt = i
    print(i[0]+'.'+i[1])

 

시간/공간 복잡도

 

 

O(N)

 

 

최적화 및 개선

 

input을 통해 하나의 변수가 아닌 여러 변수를 연속적으로 받을때는 입력에 input함수를 사용하면 시간초과가 걸릴 수 있

다. 이를 개선하기 위해 sys.stdin.readline을 사용하면 시간을 줄일 수 있다.  

 

특정 값이 순서와 관계없이 시퀀스 자료에서 존재하는지 확인만 하고 싶을 경우, 해당 시퀀스 자료의 자료형을 set으로 설정하는 것이 list나 다른 자료형 보다 시간을 확 줄일 수 있다. 

 

 

근거는 다음과 같다. 

 

Set은 List보다 더 빠른 탐색 속도를 가진다.
그 이유는 내부적인 데이터 구조와 탐색 알고리즘의 차이 때문입니다.

1. 데이터 구조: 
- Set은 해시 테이블(Hash Table)로 구현되어 있습니다. 해시 테이블은 값에 대한 고유한 해시 코드를 계산하고, 해당 해시 코드를 기반으로 값을 저장하고 검색합니다. 이렇게 함으로써 Set은 중복된 값을 허용하지 않으며, 값에 상수 시간(O(1))으로 접근할 수 있습니다.
- List는 배열(Array)로 구현되어 있습니다. 배열은 각 요소가 인덱스로 직접 접근되므로 인덱스를 알면 상수 시간(O(1))에 해당 요소에 접근할 수 있습니다. 하지만 List에서 값을 검색하기 위해서는 전체 리스트를 순회해야 하므로 최악의 경우 선형 시간(O(N))이 걸릴 수 있습니다. 

2. 탐색 알고리즘: 
- Set에서 값의 존재 여부를 확인하는 연산은 내부적으로 해시 함수와 버킷(bucket)을 사용하여 상수 시간O(1) 안에 처리됩니다. 
- List에서 값의 존재 여부를 확인하기 위해서는 순차적인 비교 연산을 수행해야 합니다. 따라서 최악의 경우 리스트의 모든 요소를 순회해야 하므로 선형 시간O(n)이 걸립니다. 따라서 Set은 내부적인 데이터 구조와 탐색 알고리즘을 통해 중복을 제거하고 빠른 탐색 속도를 제공합니다. 

그러나 Set은 순서가 보장되지 않으며, 인덱스 기반 접근이 불가능하기 때문에 특정 위치의 요소에 바로 접근하는 용도보다는 멤버십(Membership) 확인(=존재유무확인) 등을 위한 용도로 주로 사용됩니다.

출처: https://05-archives.tistory.com/232 [05의 개발 계발:티스토리]

 

 

어려웠던 점

 

로직적으로 맞게 코드를 짜도 입출력 함수나 자료형 설정에 따라 시간 초과되는 코드가 정답처리가 되다니 놀랍다!!

이제 이런 부분도 열심히 챙기면서 문제 풀어야겠다. 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/132265

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

문제설명

 

철수는 롤케이크를 두 조각으로 잘라서 동생과 한 조각씩 나눠 먹으려고 합니다. 이 롤케이크에는 여러가지 토핑들이 일렬로 올려져 있습니다. 철수와 동생은 롤케이크를 공평하게 나눠먹으려 하는데, 그들은 롤케이크의 크기보다 롤케이크 위에 올려진 토핑들의 종류에 더 관심이 많습니다. 그래서 잘린 조각들의 크기와 올려진 토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것으로 생각합니다.

 

예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을 1, 2, 3, 4와 같이 번호로 표시했을 때, 케이크 위에 토핑들이 [1, 2, 1, 3, 1, 4, 1, 2] 순서로 올려져 있습니다. 만약 세 번째 토핑(1)과 네 번째 토핑(3) 사이를 자르면 롤케이크의 토핑은 [1, 2, 1], [3, 1, 4, 1, 2]로 나뉘게 됩니다. 철수가 [1, 2, 1]이 놓인 조각을, 동생이 [3, 1, 4, 1, 2]가 놓인 조각을 먹게 되면 철수는 두 가지 토핑(1, 2)을 맛볼 수 있지만, 동생은 네 가지 토핑(1, 2, 3, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것이 아닙니다. 만약 롤케이크의 네 번째 토핑(3)과 다섯 번째 토핑(1) 사이를 자르면 [1, 2, 1, 3], [1, 4, 1, 2]로 나뉘게 됩니다. 이 경우 철수는 세 가지 토핑(1, 2, 3), 동생도 세 가지 토핑(1, 2, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것입니다. 공평하게 롤케이크를 자르는 방법은 여러가지 일 수 있습니다. 위의 롤케이크를 [1, 2, 1, 3, 1], [4, 1, 2]으로 잘라도 공평하게 나뉩니다. 어떤 경우에는 롤케이크를 공평하게 나누지 못할 수도 있습니다.

 

롤케이크에 올려진 토핑들의 번호를 저장한 정수 배열 topping이 매개변수로 주어질 때, 롤케이크를 공평하게 자르는 방법의 수를 return 하도록 solution 함수를 완성해주세요.

 

문제 해결 방법

 

topping을 딕셔너리를 통해 분류후 개수를 센다. 

집합 자료형을 하나 만들어서 topping을 순회하며 하나씩 담고, topping 딕셔너리에도 수정사항을 반영해준다. 

이때, 집합 자료형과, 만들어둔 딕셔너리의 크기를 비교해서 같으면 카운트 해준다. 

 

 

코드 구현

 

from collections import Counter
def solution(topping):
    answer = 0
    
    topping_counter = Counter(topping)
    # print(len(topping_counter)) 딕셔너리의 키 개수가 나옴
    
    half_topping_set = set()
    
    for t in topping:
        half_topping_set.add(t)
        topping_counter[t] -= 1
        
        if topping_counter[t] == 0:
            topping_counter.pop(t)
        
        if len(half_topping_set) == len(topping_counter):
            answer +=1
    
    
    return answer

 

 

 

시간/공간 복잡도

 

O(n)

 

최적화 및 개선

 

처음에는 슬라이스도 쓰고 이중반복문도 쓰고 해서 거의 O(N^3)의 시간복잡도로 코드를 작성했는데 시간초과가 나서 수정했다. 

 


어려웠던 점

 

딕셔너리를 저렇게 활용할 생각을 못했다. 

저렇게 구현하는 방법을 생각해내는 것이 어렵다.

딕셔너리의 개수를 세아리면 key의 개수가 나온다는 것을 알게됐고, 딕셔너리는 키값으로 pop()을 하면 해당 키값과 value값은 삭제되는 것을 알게됐다. set함수는 값을 추가할 때, add를 사용하는것을 완전히 알게됐다. 

 

그리고 리스트가 있을때, 딕셔너리의 형태로 정리하고싶으면 Counter함수를 사용하면 쉽게 정리가 된다는 것을 알게됐다. 

+ Recent posts