오늘의 회고
어제와 달리 코딩테스트 문제 1개가 생각보다 빨리 풀려서 기분이 좋았음
빨간날이 이렇게 좋으면 다다음주 부턴 어떻게하냐
비와서 뛰질 못하네
내일 할일
- 자바 코딩테스트 문제
- 자바 기본기 다지기
- 팀 프로젝트
=================================================================================
공부한 내용
[자바 알고리즘 문제 출처: 프로그래머스]
문제:
정수를 저장할 수 있는 자료구조 S가 있습니다. 이 자료구조에는 command 명령이 있고, 정수 N에 대하여 다음과 같이 동작합니다.
- command N: S에 N이 없으면 추가하고 있으면 삭제한다.
비어있는 S에 순서대로 command를 실행할 정수들이 들어있는 queries가 매개변수로 주어질 때, 전부 처리한 뒤 자료구조 S에 있는 정수의 개수를 return 하는 solution 함수를 작성해 주세요.
import java.util.*;
class Solution {
public int solution(int[] queries) {
int answer = 0;
HashSet<Integer> set = new HashSet<>();
for(int i=0;i<queries.length;i++){
if(set.contains(queries[i])){
set.remove(queries[i]);
}else{
set.add(queries[i]);
}
}
answer=set.size();
return answer;
}
}
나의 생각은 set을 만들어두고 for문으로 배열을 돌려 set에 queries의 요소들이 포함되있다면 remove로 빼주고 없다면 add로 더해준 다음 그 사이즈를 리턴 해준다는 것이다. 정답 (answer=set.size()말고 set size를 return했으면 더 괜찮았을 것 같다.)
final 제어자
변경할수 없다는 의미
final class FinalTest(){ // 상속이 불가
final int a=1; // 값이 변경 X
final void finalMethod(){
/*
오버라이딩 불가
*/
}
}
static 제어자
공통적인 이라는 의미
인스턴스를 생성하지 않고 사용할수 있고 해당 클래스의 모든 인스턴스가 공유 된다.
class StaticTest(){
static int a; // 클래스 필드
static{
/*
static 초기화 블록
*/
}
static void staticMethod(){
/*
구현부
/*
}
}
저 위 코드에서 static이 붙어있지 않다면
StaticTest st = new StaticTest();
를 해주어야 하는데 static이 붙어있다면
System.out.println(StaticTest.a);
인스턴스를 생성하지 않고도 사용가능 하다.
static 초기화블록이 나왔을 때 생소하고 굳이 사용할 필요가 있을까라는 생각을 해서 알아보았다.
초기화 블록은 클래스 필드의 초기화만을 담당하는 { }로 둘러싸인 블록을 의미한다.
이 초기화 블록은 생성자보다 먼저 호출이된다고 한다.
여러 개의 생성자가 있으면 코드의 중복이 생기는데 초기화블록을 사용함으로서 코드의 중복을 막을 수 있다.
class StaticBlock{
static String name;
int age;
static{
name="준민";
}
{
age=26;
System.out.print(age);
}
}
public class staticMethod{
public static void main(String[] args){
System.out.print(StaticBlock.name);
StaticBlock staticblock = new StaticBlock();
System.out.print(staticblock.age+1);
}
}
이 코드의 실행 결과는 준민2627이다 위에 말 처럼 생성자보다 초기화블록이 먼저 호출된다고 알수 있다. 근데 아직 왜 쓰는지는 더 공부하면서 알아가야할 것 같다.
abstract 제어자
추상적인 이라는 의미
abstract class AbstractTest{ // 추상 클래스
abstract void abstractMethod(); // 추상 메소드
}
선언부만 있고 구현부가 없는 추상 메소드이고 class와 void 앞에 abstract를 붙여야 한다.
같이 쓸수 없는 제어자
final과 abstract : final은 상속을 못한다고 알게 되어있고 abstract는 상속해서 오버라이딩해서 사용해야하므로 같이 사용을 하지 못한다.
메소드 static과 abstract: static 메소드는 인스턴스를 생성하지 않고 바로 사용할수 있다는 것을 배웠다. abstract메소드는 선언부만 있고 구현부가 없는데 아직 구현을 하지못했는데 바로 사용할수는 없기 때문에 같이 사용을 못한다.
메소드 private과 abstract: 이것도 final과 비슷한 이유로 생각하면 된다.
메소드 private와 final : 위 예시와 달리 같이 사용을 하지 못하는 것은 아니다. 하지만 둘다 각각 따로 사용해도 충분히 의미(재정의 할수 없음)가 전달된다.
'TIL' 카테고리의 다른 글
[TIL] 스파르타 백엔드 캠프 6일차 (0) | 2024.10.07 |
---|---|
[TIL] 스파르타 백엔드 캠프 5일차 (3) | 2024.10.04 |
[TIL] 스파르타 백엔드 캠프 3일차 (2) | 2024.10.02 |
[TIL] 스파르타 백엔드 캠프 2일차 (2) | 2024.10.01 |
[TIL] 스파르타 백엔드 캠프 1일차 (6) | 2024.09.30 |