728x90
반응형

지루성두피염을 4년?정도 앓고있는것같다.

 

피부과에서 더비솔액?이랑 먹는거 받아서 먹고 바르기를 3년넘게 하다가

약먹을때, 바를때만 나아지고 다시 며칠뒤면 두피전체가 아주 X창이 났다.

 

스테로이드성 치료제 오래쓰면 안된다는말이 많던데 우리 의사는 왜 맨날 달라는데로 잘만 주는지?

그렇게 몇년을 썼다. 문제는없었음;

 

갈수록 뭔가 두피염 때문인지 머리숱도 적어지는것같고..

아무래도 이렇게 평생 살순없을거같아서 여러 방법을 시도하던중 이제 좀 찾은거같달까

 

내 상태

비만 아님. 땀 많음. 열 많음. 술 많이 안먹음. 헬스 함. 발에 땀나서 어쩔땐 발냄새도 좀 나는편

자극적인 음식 좋아함(맵짜). 흡연함

 

우선 해봤던것들 적어보자

 

1. 니조랄 샴푸 - 한창 심할때 쓰면 자극 엄청나고 엄청 더 심해지는 느낌이라 안쓰다가 최근에 다시 써봤음. 근데 효과없고 뭔가 한두개 나있던애들마저 자극시켜서 더 화나게 하는거같아서 다시 안써보는중

2. 헤드앤숄더 크리니컬 스트랭스인가 먼가 보라색 사서 현재 매일 사용중, 아침하고 저녁, 나쁘지않음. 머리 뻣뻣해져서 린스?같은거 같이 쓰는중 다이소꺼였나

3. 샴푸해놓고 양치하면서 뭐 3분이상 유지하라는거 하는중(효과있는지는 모르겠음 오히려 쎈샴푸?같은거 썼을때는 더 자극있는거같았음)

4. 나는 반곱슬인데, 머릿결이 뻣뻣할때 휜 머리카락이 두피를 찌르는?느낌이랄까 뭔가 기분이 그래서 린스써서 머릿결 찰랑찰랑하게 유지해보려고했음(근데 이거 뭔가 기분탓인지 효과있는듯했음)

5. 찬바람말리기(실패) 너무 답답하고 머리말리다가 땀나고 개안마름(머리가 좀 긴편이긴함. 장발은 아님). 그냥 너무 뜨거운거만 안하는중

6. 두피도 피부니까 뭔가 건조해서 그런가해서 다이소에서 분무기형태??로된 토너같은거 두피에 일상생활중에 자주 막 뿌리기 해봤는데 기분탓인지 며칠 효과있는거 같았다가 똑같이 심해지길래 걍 안함

7. 두피용 앰플, 토너 막 시원한 느낌드는것들 올리브영 순위에 있는거 몇개 써봤는데, 오히려 두피염 심할때쓰면 그냥 개 자극 심해서 염증폭발해버려서 안씀

8. 알페신 카페인 어쩌고 하는 샴푸도 써봤으나 효과못봄

9. 닥터포헤어꺼 샴푸 괜찮았는데 그래도 뭐 지루성두피염이 좋아지거나 하진않음. 그래도 막 샴푸떄문에 심해졌다는 느낌은 없었음

10. 바이브랩 스칼프 스피옥실 리액트샷 어쩌구 하는거 올영가서 두피에 바를거 없나 보다가 그냥 사봤는데, 두피염에 효과는 없었으나 앞머리쪽에 쬬맨한 원형탈모?비슷하게 있는곳에만 바르는데 뭔가 채워지는 느낌이 드는거임. 두개세트사서 하나는 두피 전체바르니까 무슨 일주일?인가만에 다 쓰길래 아까워서 탈모생길거같은 앞쪽만 바르는중 원형탈모 저거 확실히 줄어들면 재구매 해보고 다시 말함

11. 식습관 조절 - 나는 맵고 짜고 단거 좋아하는데 이게 얼굴에 열을 너무 주나 해서 좀 줄여보려고 노력하는중, 기분탓 효과는 좀 있는듯. 근데 요즘 너무 자극적인 음식이 많아서 실제로는 하고있다고 보긴 힘드네..

12. 수면 - 8시간 이상 자는거 며칠 해봤는데, 효과 있는듯했음. 일찍잠드는것만으로도.. 근데 이것도 현실적으로 너무 지키기 힘듬.

그래도 내 생활중에 바꿔서 지루성두피염에 효과있는것들중엔 제일 좋은듯함

13. 다이소에서 무슨 파란색 막 두피 스케일링 어쩌구 아 아니다 다이소에있는 두피에 좋다고 인스타같은데 뜨는것들 다 써봤는데 효과없었음. 기분탓효과 하루는 있었던듯

14. 스트레스관리(실패) - 일을 안하고 살수있으면 지루성 두피염도 사라질듯(첫 직장에 들어가고부터 생겼기 때문)

15. 헬스 - 땀흘리는 운동해야 좋다 어쩐다 하는데, 운동하면서 얼굴에 열올라가고 운동하는동안 땀식고 마르고 하는동안 두피염 더 악화되는거같음;; 이건 어떻게 해야할지 모르겠는데 일단 헬스는 함

16. 한때는 전자담배에 있는 무슨 성분이 알레르기?가 있다고해서 전자담배를 끊고 연초를 피웠는데 진짜 신기하게 지루성 두피염이 좀 나아지는거임. 그래서 연초만 피웠는데, 이것도 결국 어느날 컨디션 안좋으니까 두피 폭발하길래 원인이 아닌가? 싶었는데.

확실히 다시 전자담배 피니까 더 심해지는거임. 그래서 결국 아이코스 찐담으로 갈아타서 피워대는중. 다시 전담피고싶다.

17. 여기가 이제 진짜 효과인데. 두피에좋은 비타민이라도 챙겨먹어보자 해서 GPT랑 지루성두피염에 좋은 비타민 추천해달라서해서 종합비타민이랑 오메가3를 아이허브에서 사서 먹었는데. 진짜. 효과있음. 근데 이거 아닐수도있는데. 맞는거같음. 오메가3가 효과가있는거같은데..예전에 한창 헬스하면서 몸챙긴다고 각종 비타민 다 먹고 비타민C 어쩌구 머 다 먹었는데 효과있다고 생각한적이없는데. 암튼 이번에 갑자기 두개만 딱 먹는데 효과있음. 더이상 약 안바르고도 살 수도 있을거같음. 근데 술먹은날이나, 늦게까지 놀다가 졸리고 피곤함을 느낀날은 몇개 올라와서 약 그냥 남은거 발라버리는중.

 

- 결론

현재 하는것들중에 뭔가가 효과가 굉장해서 많이 호전되었고, 컨디션 조절이랑 술만 안먹어도 더이상 피부과안다니고 살수있을것만 같다.

1. 샴푸 3분 유지(가장 효과없는거같은거)

2. 헤드엔숄더 크리니컬 스트랭스 보라색 사용

3. 오메가3(이것도 머 찐오메가3 머 성분 두개 합쳐서 800 인가뭔가), 종합비타민(투퍼데이인가 뭔가임)

4. 잠좀 최대한 일찍자기

5. 바이브랩 스칼프 스피옥실 리액트샷 어쩌구 하는거(이건 지루성두피염이랑은 상관없이 탈모개선?)

6. 전자담배 -> 찐담배

7. 헬스(하루에 40분가량..)

8. 식습관 조절 - 잘 안되긴하는데 나름 노력

9. 술 - 아 맞다. 이것도. 맥주먹으면 심해지고 소주먹으면 좀 덜 심해짐. 그래서 소주만 먹으려 하는데 또 여름인데 시원하게 소맥 말고싶어서 잘 못지키는데, 맥주 먹으면 먹으면서 두피염 올라오는게 느껴질때가 많음;;

 

생각나는건 여기까지인데, 더 실험해보고 올게요

728x90
반응형
728x90
반응형

크롬 비활성 탭에서 setInterval이 1분으로 변하는 이유

 

웹 개발하다 보면 이런 거 한 번쯤 겪는다.

setInterval을 5초로 돌려놨는데
어느 순간부터 1분마다 실행됨

다시 탭 눌러도 바로 안 돌아오고
그대로 계속 느리게 돌아가는 경우도 있음

이거 버그 아니고 크롬 정책이다.

 

아래 크롬 디버깅에서 실시간으로 탭 상태를 확인해볼수도 있다.

chrome://discards/


반응형

문제 상황

이런 코드가 있다고 치자

setInterval(() => {
  console.log("실행");
}, 5000);

 

정상이라면 5초마다 찍혀야 한다.

근데 탭을 다른 데로 넘기면

  • 처음엔 정상
  • 어느 순간부터 60초로 바뀜
  • 다시 돌아와도 그대로 유지되는 경우 있음

왜 이러냐

크롬이 일부러 그렇게 만든거다.

탭이 화면에 안 보이면
CPU 아끼려고 타이머를 제한한다.

핵심은 이거 하나임

백그라운드 탭에서는 타이머 최소 실행 간격이 1분까지 늘어날 수 있음

그래서 5초로 줘도 실제로는 60초로 실행된다.

 


상태 개념 간단 정리

크롬에는 페이지 상태가 있다

  • active → 화면에 보이는 상태
  • hidden → 백그라운드
  • frozen → 거의 멈춘 상태

hidden부터 이미 타이머 제한 걸린다.


중요한 포인트

이게 더 문제다.

탭을 다시 눌러서 active로 바꿔도
타이머가 즉시 정상으로 안 돌아올 수 있다.

그래서

  • 몇 시간 켜둠
  • 다시 돌아옴
  • 여전히 1분으로 돌아감

이런 상황이 실제로 발생한다.


해결 방법

이건 막는 게 아니라 대응해야 한다.

1. visibilitychange로 감지

document.addEventListener("visibilitychange", () => {
  if (document.visibilityState === "visible") {
    restartTimer();
  }
});

 

2. 타이머 재생성

let interval;

function startTimer() {
  interval = setInterval(() => {
    console.log("실행");
  }, 5000);
}

function restartTimer() {
  clearInterval(interval);
  startTimer();
}

이거 안 하면 계속 1분 유지되는 경우 있음

 

3. 시간 차이로 이상 감지

let last = Date.now();

setInterval(() => {
  const now = Date.now();

  if (now - last > 10000) {
    console.log("타이머 꼬임");
    location.reload();
  }

  last = now;
}, 5000);

타이머가 밀리면 강제로 복구하는 방식

 

4. setTimeout 루프로 바꾸기

function loop() {
  setTimeout(() => {
    console.log("실행");
    loop();
  }, 5000);
}

loop();

상황에 따라 이게 더 안정적일 때도 있다.


못하는 것

비활성화 안 되게 하는 거

이건 거의 불가능하다.

  • 소리 재생 → 일부 효과 있음
  • 강제 활성화 → 안됨

브라우저 정책이라 못 막는다.

 


정리

  • 크롬은 백그라운드에서 타이머를 강제로 늦춘다
  • 다시 활성화해도 자동으로 정상 복구 안 될 수 있다
  • 그래서 반드시 복구 로직을 넣어야 한다

한 줄 요약

setInterval은 정확하지 않다.
특히 백그라운드에서는 더 그렇다.

728x90
반응형
728x90
반응형

try-catch 구문은 프로그램 실행 중 예외가 발생할 가능성이 있는 코드를 감싸는 구문입니다. try 블록에는 예외가 발생할 가능성이 있는 코드를 작성하고, 예외가 발생하면 catch 블록에서 예외를 처리합니다.

try-catch 구문의 기본 문법은 다음과 같습니다.

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType1 e1) {
    // 예외1 처리 코드
} catch (ExceptionType2 e2) {
    // 예외2 처리 코드
} catch (ExceptionType3 e3) {
    // 예외3 처리 코드
} finally {
    // 예외 발생 여부에 관계없이 항상 실행되는 코드
}

 

위 구문에서 try 블록 내에서 예외가 발생하면, 해당 예외를 처리하는 catch 블록이 실행됩니다. 여러 개의 catch 블록을 사용하여 예외의 종류에 따라 다르게 처리할 수 있습니다.

마지막으로 finally 블록은 예외 발생 여부에 관계없이 항상 실행되는 코드입니다. 예외 발생 시 처리할 코드나 리소스를 해제하는 코드 등을 작성합니다.

 

 finally 블록은 생략해도 상관은 없습니다.


그러나 finally 블록은 보통 자원을 해제하는 등의 정리 작업을 수행하기 위해 사용됩니다. 예를 들어 파일을 열어 작업을 수행한 후에는 finally 블록에서 파일을 닫는 코드를 작성하여 파일을 안전하게 닫을 수 있습니다.

그렇기 때문에 finally 블록을 생략하면 자원 누수 등의 문제가 발생할 수 있으므로, finally 블록을 꼭 작성하는 것이 좋습니다.



예를 들어, 다음은 숫자를 나누는 예제 코드입니다.

int a = 10;
int b = 0;

try {
    int c = a / b;
    System.out.println(c);
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다.");
} finally {
    System.out.println("프로그램을 종료합니다.");
}

위 코드에서는 try 블록 내에서 a를 b로 나누려고 하면 예외가 발생할 가능성이 있습니다. 이를 catch 블록에서 ArithmeticException 예외를 처리하고, finally 블록에서 프로그램을 종료하기 전에 항상 출력되는 메시지를 출력합니다.

실행 결과는 다음과 같습니다.

0으로 나눌 수 없습니다.
프로그램을 종료합니다.

따라서 try-catch 구문을 사용하여 예외 처리를 함으로써 프로그램이 비정상적으로 종료되는 것을 방지하고, 안정성을 높일 수 있습니다.

 

Java에서 예외 처리를 위한 Exception 클래스와 그 하위 클래스들이 존재합니다.

 catch 블록에서 처리할 예외 클래스는 try 블록에서 예외가 발생할 수 있는 클래스와 일치해야 합니다. 예외 처리를 위한 주요 예외 클래스는 다음과 같습니다.

1. Exception 클래스: 모든 예외 클래스의 최상위 클래스입니다.
2. RuntimeException 클래스: 프로그램의 오류나 버그에 의해 발생하는 예외입니다. try-catch 구문을 사용하지 않아도 컴파일러에서 오류가 발생하지 않습니다.
3. IOException 클래스: 입출력 작업 중 발생하는 예외입니다.
4. SQLException 클래스: 데이터베이스 연결과 관련된 예외입니다.
5. NullPointerException 클래스: 객체 참조가 null인 상태에서 객체의 메서드를 호출하려고 할 때 발생하는 예외입니다.


이 외에도 다양한 예외 클래스가 존재합니다. 예를 들어, FileNotFoundException 클래스는 파일이 존재하지 않을 때 발생하는 예외를 처리합니다. 따라서 try-catch 구문을 사용할 때, 발생할 가능성이 있는 예외의 종류를 파악하고 적절한 예외 클래스를 사용하여 catch 블록을 작성해야 합니다.

728x90
반응형
728x90
반응형

JsonParser 객체는 JSON 데이터를 파싱하는 Java의 클래스입니다. Java에서는 JSON 데이터를 파싱하여 객체나 배열로 변환하기 위해 JsonParser 객체를 사용할 수 있습니다.

JsonParser 객체는 JSON 데이터를 파싱하기 위해 다음과 같은 메서드를 제공합니다.

parse(String json) : JSON 문자열을 파싱하여 JsonObject 또는 JsonArray 객체로 변환합니다.
parse(Reader json) : JSON 문자열을 파싱하여 JsonObject 또는 JsonArray 객체로 변환합니다.
parse(InputStream json) : JSON 문자열을 파싱하여 JsonObject 또는 JsonArray 객체로 변환합니다.
JsonObject는 JSON 데이터에서 중괄호({})로 둘러싸인 객체를 나타내며, JsonArray는 대괄호([])로 둘러싸인 배열을 나타냅니다.

예를 들어, 다음과 같은 JSON 데이터가 있다고 가정해봅시다.

{
  "name": "John",
  "age": 30,
  "city": "New York"
}


이 데이터를 파싱하여 JsonObject 객체로 변환하는 코드는 다음과 같습니다.

String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(jsonStr).getAsJsonObject();

JsonObject 객체의 "name" 속성에 "Tom"이라는 값을 담는 코드는 다음과 같습니다.

jsonObject.addProperty("name", "Tom");

JsonObject 객체의 "name" 속성에 "Tom"이라는 값을 담은 후, JsonObject를 다시 JSON 문자열로 변환하는 코드는 다음과 같습니다

String updatedJsonStr = jsonObject.toString();

이렇게 변환된 JSON 문자열 updatedJsonStr의 값은 다음과 같습니다.

{"name":"Tom","age":30,"city":"New York"}

 

이처럼 JsonParser 객체를 사용하여 JSON 데이터를 파싱하면, Java에서 JSON 데이터를 쉽게 가공하거나 활용할 수 있습니다.

 

 

728x90
반응형
728x90
반응형

JSON(JavaScript Object Notation)은 경량 데이터 교환 형식으로, 인간이 읽고 쓰기 쉽고, 기계가 분석하고 생성하기도 쉽습니다. 특히 웹 어플리케이션에서 데이터 전송과 저장을 위한 표준 포맷으로 널리 사용됩니다.

JSON은 키-값 쌍으로 이루어진 객체와 배열, 문자열, 숫자, 불리언(true/false)값과 null 값을 표현할 수 있습니다. JSON 포맷은 일반 텍스트로 작성되며, 파일 확장자는 .json으로 표시됩니다.

아래는 간단한 JSON 객체의 예시입니다.

{
  "name": "John",
  "age": 30,
  "city": "New York"
}


이 객체는 "name", "age", "city" 세 개의 키를 가지며, 각각의 값은 문자열 "John", 숫자 30, 문자열 "New York"입니다.

JSON은 다른 프로그래밍 언어와 상호 운용성이 좋습니다. 예를 들어, 자바스크립트에서 JSON 객체를 파싱하여 객체 또는 배열로 변환할 수 있으며, 파이썬에서는 json 모듈을 사용하여 JSON 데이터를 읽고 쓸 수 있습니다.

JSON은 XML에 비해 문법이 간단하며, 더 가볍고 빠르게 처리할 수 있습니다. 그러나 JSON은 XML보다 표현력이 떨어지며, 메타데이터를 표현하기에 적합하지 않습니다.

JSON은 현재 웹에서 가장 많이 사용되는 데이터 교환 형식 중 하나이며, 다양한 프로그래밍 언어와 기술에서 널리 사용됩니다.

JSON 데이터를 생성하고 가공하는 방법은 다양합니다. 여기에서는 일반적으로 사용되는 몇 가지 방법을 설명하겠습니다.

1. 객체 리터럴 사용하기
JavaScript에서 JSON 데이터를 생성하는 가장 간단한 방법은 객체 리터럴을 사용하는 것입니다. 객체 리터럴은 중괄호({}) 안에 키-값 쌍으로 데이터를 정의하는 방법입니다. 예를 들어:

 

var person = { "name": "John", "age": 30, "city": "New York" };

2. JSON.stringify() 사용하기
JavaScript에서는 JSON.stringify() 함수를 사용하여 객체를 JSON 문자열로 변환할 수 있습니다. 예를 들어:

var person = { "name": "John", "age": 30, "city": "New York" };
var jsonStr = JSON.stringify(person);
console.log(jsonStr); // 결과: {"name":"John","age":30,"city":"New York"}

3. JSON.parse() 사용하기
JSON 문자열을 JavaScript 객체로 변환하려면 JSON.parse() 함수를 사용합니다. 예를 들어:

var jsonStr = '{"name":"John","age":30,"city":"New York"}';
var person = JSON.parse(jsonStr);
console.log(person.name); // 결과: "John"

4. REST API에서 데이터 가져오기
REST API는 JSON 형식의 데이터를 제공하는 것이 일반적입니다. JavaScript에서는 XMLHttpRequest 객체나 fetch API를 사용하여 서버에서 데이터를 가져올 수 있습니다. 

fetch('https://example.com/api/person/1')
  .then(response => response.json())
  .then(data => console.log(data.name));


이처럼 JSON 데이터를 생성하고 가공하는 방법은 다양합니다. 어떤 방법을 선택하느냐에 따라 데이터 생성과 가공의 효율성과 편리성이 달라질 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
728x90
반응형
JSTL(JavaServer Pages Standard Tag Library)은 JSP(JavaServer Pages)를 개발할 때 사용할 수 있는 태그 라이브러리입니다.
JSTL은 Java 웹 개발에서 자주 사용되는 코드를 태그 형식으로 제공하여 개발자들이 더 간단하고 효율적으로 JSP를 작성할 수 있도록 지원합니다.
JSTL은 다양한 태그 라이브러리를 제공합니다. 예를 들어, core 태그 라이브러리는 JSP 페이지에서 변수를 선언하고 출력하는 기능을 제공합니다. 또한, loop 태그 라이브러리는 for문과 같은 반복문을 처리할 수 있습니다. 이 밖에도 JSTL은 조건문, 함수 호출, URL 처리 등 다양한 기능을 제공합니다.
JSTL은 Java 웹 개발에서 일반적으로 사용되는 자바 코드를 JSP 페이지에서 처리할 수 있도록 하여, 개발자들이 더 쉽게 JSP 페이지를 작성할 수 있도록 합니다. 또한, JSTL은 태그 형태로 제공되기 때문에 코드의 가독성을 높이고 유지보수를 더 쉽게 할 수 있습니다.
JSTL은 자바 웹 개발에서 광범위하게 사용되며, 다양한 태그 라이브러리를 제공하여 개발자들이 더 간편하게 JSP 페이지를 작성할 수 있도록 도와줍니다.

 

 

1. JSTL 라이브러리 추가하기
먼저, JSTL 라이브러리를 다운로드 받아 프로젝트에 추가해야 합니다. JSTL 라이브러리는 JSP 페이지에서 사용할 수 있는 태그 라이브러리입니다. 이 라이브러리를 사용하기 위해서는 다음과 같이 웹 프로젝트의 WEB-INF/lib 디렉토리에 jstl.jar 파일과 standard.jar 파일을 추가해야 합니다.

2. JSTL 태그 라이브러리 선언하기
JSTL 태그를 사용하려면 JSTL 태그 라이브러리를 선언해야 합니다. JSP 페이지의 상단에 다음과 같이 선언합니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 - prefix 속성은 태그를 구분하기 위한 접두어를 지정하고, uri 속성은 JSTL 태그 라이브러리의 위치를 지정합니다.

3. JSTL 태그 사용하기
JSTL 태그를 사용하는 방법은 다음과 같습니다.

 3-1 변수 선언

<c:set var="변수명" value="값" />

3-2 변수 출력

<c:out value="${변수명}" />

3-3 조건문

<c:if test="${조건식}">
  ...
</c:if>

 

3-4 반복문

<c:forEach var="변수명" items="${컬렉션}">
  ...
</c:forEach>

3-5 함수 호출

${fn:함수명(인자)}

 

 

 

728x90
반응형
728x90
반응형

자바에서 받아온 변수를 JSTL을 사용해서 출력, 수정 등 컨트롤할 수 있다.

JSTL을 이용해서 받아온 변수를 수정하거나 다루는방법을 정리해본다.

 

<c:set>에는 property, scope, target, value, var 5개의 속성을 사용할 수 있다.

 - property : 프로퍼티 설정

 - scope : 변수가 저장된 스코프이며, page, request, session, application 4가지 속성값을 가질 수 있고, 선언하지 않아도 기본값으로 page가 설정된다.

 - target : 프로퍼티를 설정할 빈 또는 맵

 - value : 변수에 넣을 값

 - var : 변수명

 

1. 변수 선언하기 <c:set>

<!-- 기본선언 -->
<c:set var="item1" value="computer">

<!-- 출력 -->
${item1}

<!-- scope사용, 미선언시 기본값 "page" -->
<c:set var="item1" value="computer" scope="request">

 

2. 변수 삭제하기 <c:remove>

<!-- 해당 변수 삭제 -->
<c:remove var="item1"/>

<!-- 
해당 스코프의 변수 삭제
*스코프 선언하지 않을경우 모든스코프의 해당변수삭제
-->
<c:remove var="item1" scope="request"/>

 3. 변수 출력하기 <c:out>

<!-- 변수 출력1 -->
<c:out value="${item1}"/>

<!-- 변수 출력2 (item1의 값이 null일시 "item"으로 출력) -->
<c:out value="${item1} default="item"/>

<!-- 변수 출력3 -->
${item1}

 

이렇게 JSTL 변수 기본 사용법을 마무리하고, 응용까지 해보자.

 

1. 변수값 변경

<!-- 변수 선언 -->
<c:set var="item1" value="computer"/>
<c:set var="item2" value="mouse"/>
<c:set var="tmp" value="${item1}"/>

${item1} <!-- 결과 : computer -->
${item2} <!-- 결과 : mouse -->

<!-- 변수값 바꾸기 -->
<c:set var="item1" value="${item2}"/>
<c:set var="item2" value="${tmp}"/>

${item1} <!-- 결과 : mouse-->
${item2} <!-- 결과 : computer-->

 

2. Map 변수선언 및 사용

<c:set var="myMap">
    <c:catch>
        <%
            Map<String, String> map = new HashMap<String, String>();
            map.put("key1", "value1");
            map.put("key2", "value2");
            out.print(map);
        %>
    </c:catch>
</c:set>

<c:forEach var="entry" items="${myMap}">
    Key: ${entry.key}, Value: ${entry.value}
</c:forEach>

위 코드에서는 <c:set> 태그를 사용하여 "myMap"이라는 이름의 변수를 선언하고,

JSP 페이지 내에서 Java 코드를 실행하여 Map 타입의 객체를 생성하고,

이 객체를 "myMap" 변수에 할당한다.

그 후 <c:forEach> 태그를 사용하여 "myMap" 변수에 저장된 Map 타입의 객체를 반복문으로 순회하며,

각각의 키와 값을 출력한다.

즉, 변수를 선언할 때 Map 타입을 사용할 수 없지만, 변수에 Map 타입의 객체를 할당하여 사용하는 것은 가능하다.

728x90
반응형
728x90
반응형

 

스택/큐 문제지만 내 방식대로 풀어보았다.

class Solution {
	    boolean solution(String s) {
	        boolean answer = true;
	        int tmp0 = 0; // '(' 일때 ++ ,  ')' 일때 -- 할 변수
	        if(s.charAt(0) == ')') return false; //처음부터 ')'가 나오면 바로 리턴
	        if(s.charAt(s.length()-1) == '(') return false; //마지막에 '('가 나오면 바로 리턴
	        
	        for(int i = 0; i<s.length();i++) { // 0번째 자리부터 마지막자리까지 반복한다.
		        char tmp = s.charAt(i); // s의 i번째 문자를 가져온다.
		        if(tmp0 == 0 && tmp == ')') return false; // '('가 나오지 않았는데 ')'가 나오면 리턴 "()))((()" 차단
		        if(tmp == '(')tmp0++;
		        if(tmp == ')')tmp0--;
	        }
	        
	        if(tmp0 != 0) return false; // for문이 다 끝났는데 tmp0이 0이 아니면 리턴 false
	        
	        return answer; //모든 검사 후 정상적으로 괄호가 있을때 true 리턴
	    }
	}

채점결과 모두 통과했다.

다른 사람의 풀이를 보자..

class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int count = 0;
        for(int i = 0; i<s.length();i++){
            if(s.charAt(i) == '('){
                count++;
            }
            if(s.charAt(i) == ')'){
                count--;
            }
            if(count < 0){
                break;
            }
        }
        if(count == 0){
            answer = true;
        }

        return answer;
    }
}

이분도 스택이나 큐를 쓰지 않고 문제를 풀었다.

나랑 비슷하지만, 좀더 깔끔한것 같다.

if(s.charAt(0) == ')') return false; //처음부터 ')'가 나오면 바로 리턴
if(s.charAt(s.length()-1) == '(') return false; //마지막에 '('가 나오면 바로 리턴

나는 for문 전에 처음이나 마지막을 먼저 검사하는 부분이 있는데

이는 효율성을 나름 생각해서 “()()()()()()()()()()()()(” 이런 경우에

끝까지 검사한 후에야 리턴하기때문에 넣었던 것인데..

다른사람것도 돌려보니 속도면에서는 크게 차이는 없는것 같다.(?)

아래는 스택을 이용한 방법인것 같다.

스택은 실사용해본적이 없어서 잘 몰랐는데 이참에 공부해봐야겠다.

import java.util.Stack;
class Solution {
    boolean solution(String s) {
        boolean answer = true;  
        String res = "YES";
        Stack<Integer> st = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    st.push(1);
                } else if (s.charAt(i) == ')') {
                    if (st.isEmpty()) {
                        answer = false;
                        break;
                    } else {
                        st.pop();
                    }
                }
            }

            if(!st.isEmpty()) {

                answer = false;

            }

            System.out.println(res);
return answer;
    }   

}

Stack 사용법

Stack<String> stack = new Stack<>();
	        stack.add("스택추가");
	        stack.push("스택추가");
	        String tmp = stack.pop();

스택 사용법은 push, pop만 알고 넘어가자.

stack.add()와 stack.push()의 차이점도 알게되었는데,

add() 의 리턴값은 boolean

push() 의 리턴값은 <E>이다.

즉, add()는 성공실패를 받고

push는 넣은값을 다시 리턴받는것이다.

스택/큐 문제지만 내 방식대로 풀어보았다.

class Solution {
	    boolean solution(String s) {
	        boolean answer = true;
	        int tmp0 = 0; // '(' 일때 ++ ,  ')' 일때 -- 할 변수
	        if(s.charAt(0) == ')') return false; //처음부터 ')'가 나오면 바로 리턴
	        if(s.charAt(s.length()-1) == '(') return false; //마지막에 '('가 나오면 바로 리턴
	        
	        for(int i = 0; i<s.length();i++) { // 0번째 자리부터 마지막자리까지 반복한다.
		        char tmp = s.charAt(i); // s의 i번째 문자를 가져온다.
		        if(tmp0 == 0 && tmp == ')') return false; // '('가 나오지 않았는데 ')'가 나오면 리턴 "()))((()" 차단
		        if(tmp == '(')tmp0++;
		        if(tmp == ')')tmp0--;
	        }
	        
	        if(tmp0 != 0) return false; // for문이 다 끝났는데 tmp0이 0이 아니면 리턴 false
	        
	        return answer; //모든 검사 후 정상적으로 괄호가 있을때 true 리턴
	    }
	}

채점결과 모두 통과했다.

다른 사람의 풀이를 보자..

class Solution {
    boolean solution(String s) {
        boolean answer = false;
        int count = 0;
        for(int i = 0; i<s.length();i++){
            if(s.charAt(i) == '('){
                count++;
            }
            if(s.charAt(i) == ')'){
                count--;
            }
            if(count < 0){
                break;
            }
        }
        if(count == 0){
            answer = true;
        }

        return answer;
    }
}

이분도 스택이나 큐를 쓰지 않고 문제를 풀었다.

나랑 비슷하지만, 좀더 깔끔한것 같다.

if(s.charAt(0) == ')') return false; //처음부터 ')'가 나오면 바로 리턴
if(s.charAt(s.length()-1) == '(') return false; //마지막에 '('가 나오면 바로 리턴

나는 for문 전에 처음이나 마지막을 먼저 검사하는 부분이 있는데

이는 효율성을 나름 생각해서 “()()()()()()()()()()()()(” 이런 경우에

끝까지 검사한 후에야 리턴하기때문에 넣었던 것인데..

다른사람것도 돌려보니 속도면에서는 크게 차이는 없는것 같다.(?)

아래는 스택을 이용한 방법인것 같다.

스택은 실사용해본적이 없어서 잘 몰랐는데 이참에 공부해봐야겠다.

import java.util.Stack;
class Solution {
    boolean solution(String s) {
        boolean answer = true;  
        String res = "YES";
        Stack<Integer> st = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    st.push(1);
                } else if (s.charAt(i) == ')') {
                    if (st.isEmpty()) {
                        answer = false;
                        break;
                    } else {
                        st.pop();
                    }
                }
            }

            if(!st.isEmpty()) {

                answer = false;

            }

            System.out.println(res);
return answer;
    }   

}

Stack 사용법

Stack<String> stack = new Stack<>();
	        stack.add("스택추가");
	        stack.push("스택추가");
	        String tmp = stack.pop();

스택 사용법은 push, pop만 알고 넘어가자.

stack.add()와 stack.push()의 차이점도 알게되었는데,

add() 의 리턴값은 boolean

push() 의 리턴값은 <E>이다.

즉, add()는 성공실패를 받고

push는 넣은값을 다시 리턴받는것이다.

728x90
반응형

+ Recent posts