D   d   D

do the work

I have to /do my work

Do you wanna /do some work? = you wanna /do some work?

You don't have to /do my /work for me.

 

***아래는 비슷한 문장인데도 의문문의 마지막 단어가 강세가 와야해서 끊어 읽는 부분이 다르다

Do you want me to /cook?

Do you want me to do /yogaI can't even /do yoga. can't발음을 강하게 하기위해 even을 넣고 do를 강하게 발음  

Did you /eat?

Did you have /lunch?

========================================================================

You don't know /anything! I can't even /do yoga /any more. I only do /Pilates.

I don't do /laundry. I don't do /windows Will you /do my hair? 머리(정리등) 해줄래?I used to /do your hair.Can you /really do /makeup? Can you /do makeup? really를 넣으면 문장 강세가 바뀐다.

 

 

 

 

Posted by useways
,

=====1. Did you  [didju] 기능어라서 발음 빠르게 한다.

  d   d    D

Did you eat? 가장중요한 단어는 eat이다 

Did you leave?

 d   d    D

What did  you eat ?

When did you leave?

 

1-2. I didn't. 만 발음 하면 d D

그런데 I didn't do it. 일때는 didn't을 강하게 발음해도 되는데  I를 강하게 발음하면서 

I didn't see anything.   발음1방식

I didn't see anything.    발음2방식

I didn't know /what I was /doing

 

===== I used to ~ 하곤했다 지금은 아닌상태  d D d 발음으로 한다. u 발음에 y발음을 넣어서 혀로 밀어줘라

I used to /go to /sleep

I used to /live here

I used to be /young and /cute ***동사가 be일때는 be까지 끊어준다.***

I used to be 예전에 (똑똑, 착했, 부자)했었지~~~

'English > 소리튠' 카테고리의 다른 글

블록훈련3 I have to  (0) 2023.11.30
블록훈련2 Im gonna  (0) 2023.11.29
블록훈련1 I wanna  (1) 2023.11.27
Posted by useways
,

===온 목적 물어보기

Are you on (a) vacation?

What brings yo here?  가장 친근하다.

Why did you come here? 너무 딱딱하다

You can also use 'during' to talk about time spent on vacation instead of 'on vacation'. When we use 'during', we refer to an event that occurred while the vacation was ongoing and before it finished. Have a look:

What did you do on the vacation?

What did you do druing the vacation?

 

=== 어떻게 갔어?

1. ‘How did you get there? Did you take a bus?’
– 거기 어떻게 갔어? 버스를 탔어?

2. ‘I’m lost. How did you get there?’
– 길을 잃었어. 거기 어떻게 갔어?

3. ‘She arrived late. I wonder how she got there.’
– 그녀가 늦게 도착했어. 어떻게 거기에 갔는지 궁금해.

 

 

Posted by useways
,
const numbers = [1, 2, 3, 4, 5];

const modifiedNumbers = numbers.map(function(number) {
    if (number % 2 === 0) {
        return "Even";
    } else {
        return "Odd";
    }
});

console.log(modifiedNumbers);
// 출력: ['Odd', 'Even', 'Odd', 'Even', 'Odd']

 

 

참조

https://codingeverybody.kr/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-map-%ED%95%A8%EC%88%98/

Posted by useways
,

HashMap<String, Integer> map = new HashMap<>();
map.put("김자바", 90);
map.put("김자바", 100);
map.put("이자바", 100);
map.put("강자바", 80);
map.put("안자바", 90);
 
Set set = map.entrySet();
Iterator it = set.iterator();
 
while(it.hasNext()) {
     // Iterator 조상타입 -> Map.Entry 자손 타입의 형변환 ( 다운 캐스팅 )
     Map.Entry e = (Map.Entry)it.next();
     System.out.println("이름 : "+ e.getKey() + ", 점수 : " + e.getValue());
}

참조:

https://hstory0208.tistory.com/entry/Java%EC%9E%90%EB%B0%94-HashMap-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95

Map<String, Map<String, Object>> map = CodeService.selectApplyFile(applyFileType, tbId);

   System.out.println(".jsp =====================================================");

   Set set = map.entrySet();
   Iterator it = set.iterator();

   while(it.hasNext()) {
       // Iterator 조상타입 -> Map.Entry 자손 타입의 형변환 ( 다운 캐스팅 )
       Map.Entry e = (Map.Entry)it.next();
       System.out.println("key : "+ e.getKey() + ", value : " + e.getValue());
   }

   System.out.println(".jsp =====================================================");

 

 

 

 

Posted by useways
,

1. 5의 법칙

어떤 상황에대해서도 5개이상의 기본 팩트를 모르고있다.

베트남에 대해 5개 이야기해보시오?

2. 기억하는 방법

2.1 장소법 : 친숙한 공간 환경의 시간화를 통화 기억 강화 전략

   예로 내가 여권을 잃어버리면 아침엑 가방을 정리할때 있었다  쇼핑할때도 있었다. 등등으로 장소를 통해서 기억

2.2. 3의 법칙 : 단독으로 기억하지 말고 관련되 3가지를 연결해서 기억할것

   겔티겐 : 몽고에 유명한 장수 . 이것 하나만으로 기억하면 금방 잊는다

   기억하는데 실패하는이유는 기억을 반드시 이전기억에 겹합해서 기억하는게 중용한데

   나의 뇌가 겔티겐에 대한 결합할 기억이 없어서 그렇다.

   그래서 우리의 머리가 기본적으로 알고있는 X선 만든사람 뢴트겐과 겔포스를 기억의 고리로 사용하면\

   겔티겐이 기억된다.

2.3 대용량을 기억하는 방법 : 요점은 숫자에 있다 

   모자르트에 대한 책을 보았다. 

  사람의 인생의 우리에 기억에의거 거의 알고 있다 태어나고 학습하고 취직하고 결혼하고 죽고

  그럼 모자르트에 핵심 음악의 천재로 기억하기 위해   

  기억방법 가장 핵심이 되는 숙자하나를 기억하자 즉 모자르트는 5살 부터 작곡을 시작했다 즉 음악에 천재 

  그리고 한나더 기억하자면 특별한점 35살에 죽었다.

 

왜 기억을 해야하는가?

기억이 즉 감정이다...     먼 이웃보다 애완견에 죽음에 더 슬퍼한다. 애완견과 함께하 시간즉 기억이 많아서 감정도 많다.

감정과 선태과 판단을 한다. 

인생의 선택과판단 굴레이다.      우리의 감정 즉 좋아하고 더 소중하다고 생각하는 쪽을 사람은 선택한다. 

즉 많은 기억은 선택과 판단을 잘하게 해줄수 있다.

10분

기억이야 말로 인간이 가지고 있는 타임머신이다. 2000년 전에 중국 이야기를 기억하면 그때를 회상할수있다.

동물은 현재에 갖혀있다. 

인간을 과거를 기억해서 현재를 분석 하고 미래의 개념을 가질수 있다.

즉 기억을 인간을 시간의 한계에서 벚어날게 해줄수 있다.

  기억을 공유하면서 언어가 발생한다 즉 사과란 단어는 모두가 동의해서 생겨나고 사용하게 된것이다.

 

음식과 요리에관계에서 인간은 음식만 있어도 살수는 있다 물론 요리를 하면 더 즐길수 있지만.

우리의 교육을 음식의 재료 자체보다는 요리즉 요리하는 방법만을 가르쳤다

문재를 비비꼬고 고난의도 문재내고 천재를 만들기 위한 교육을 했다. 일반 사람이 사는 교육이 아닌.

헌데 사회나와서 살다보면 음식의 재료 즉 5의 법칙도 모르기 때문에 요리를 할수도 없다.

즉 정확한 판단을 할수없게 되었다.

세계사 공부 보다 세계지도 를 10번그려서 우리뇌의 기억의 고리에 근간을 만들어야 한다.

 

기본지식을 알아야한다.

유추하고 연결을 훈련을 안해도 인간이 기본적으로 알수있다.

 

===15분   

1.기억의 유용성 : 쓸모가 있는가

2.기억의 확장성: 확장이 가능하가 원소 주기율표, 세계지도 등등 다른 기억의 연결고리가 될수있는가

3.기억의 용이성: 원소 주기율표를 다외울려면 너무힘들고 나에게 무리다 즉 할수있게 만들어서 기억하자.

즉 기억하게 쉽게 만들자

정보를 대칭시기고 작은 단위의 유닛(모듈)으로 만들고 순서대로 배치하면 쉽게 외워진다.

 

3.1 대칭화

     1571 루터의 종교계혁  1517 레판토해전: 기독교동맹과 오스만제국의 그리스인근 레판토에서 오스만 유럽진출막음

     동서양의 역사를 대칭해도 된다.

3.2 모듈화

3.3 순서화 

청나라 황제 12명 이름 외우기 순서화 예시

3개, 3개 등 작은 그룹, 모듈로 나누라.

황제들의 이름 앞 글자를

'과도한 광선같다'로 연상시키기

머릿말 모아 한 문장으로 외우기

과: 가경제

도: 도광제

한: 함풍제

광: 광서제

선: 선통제

같다 : 동치제 (같다=동치)

 

***연결의 포인트 인출 단서를 붙여라

AD 476 년 로마가 멸망한다 + 5 = 581 메로빙거 왕조가 시작된다.

BD 108 한사군을 설치한다 + 4 BC니까 더 과거로 간다. 112년에 한무제가 베트남에 9군을 설치한다.

베트남에 북부지방을 1000년동안 중국이 지배한다.

한사군(漢四郡)은 기원전 108년 전한 한무제 고조선을 한나라멸망시킨 뒤 유민들을 통치하기 위해 세웠다고 하는 다섯 개의 군급 행정구역이다

20분

https://www.youtube.com/watch?v=KHr7A0YJuRk 

Posted by useways
,

dDd발음

I have to /I hǽv tə/

I have to /work late tonight, go, eat

해브트 3음절로 발음하면 안되고 해v트 /v발음은 해발음에 받침으로 아랫입술을 윗이빨에 붙이기만해라/

d d D d

I don't have to /tell you /that    /aidount hǽv tə/  d가 'ㄹ'처럼 발음된다.

 

You have to /work

You don't have to /work

You don't have to /stay if you /don't want to

You don't have to be af/raid

'English > 소리튠' 카테고리의 다른 글

2주 챌린지_블록 훈련 과거형 Did you~?  (0) 2023.12.14
블록훈련2 Im gonna  (0) 2023.11.29
블록훈련1 I wanna  (1) 2023.11.27
Posted by useways
,

I am going to = I'm gonna /əm'gənə/ 한단어처럼 읽는다

I'm 발음은 /aim/  /əm/ /am/  3가지로 소리낼수 있다

I'm gonna go /get a /drink

I'm gonna /sleep, eat, go outside

I'm gonna go /change my /shose

I'm gonna / give you a /choice

 

===>부정문

I'm /not gonna /eat anything /now

I'm /not gonna /yell, I'm /not gonna /threathen

 

===>의문문

Oh, shoot. / Am I gonna /get a /ticket?

 

===You're gonna ~    You're발음은  your과 같다

You're gonna /go  너는 갈꺼야. 가라는 이야기다.

You're gonna /love her

You're /not gonna /give me a /car?

You're /not gonna /be happy

 

Are you gonna a/pologize?

Are you gonna /say  - What happened?

 

===We're gonna ~    We're  발음은  were와 같다

We're gonna /lunch 

점심먹으러 갈꺼야

We're gonna /lunch? 

We're gonna /crash.  We're gonna /die.  

We're gonna /see a /movie

We're  /not gonna /hurt you.

 

'English > 소리튠' 카테고리의 다른 글

2주 챌린지_블록 훈련 과거형 Did you~?  (0) 2023.12.14
블록훈련3 I have to  (0) 2023.11.30
블록훈련1 I wanna  (1) 2023.11.27
Posted by useways
,

===팬턴1

d D d 발음이다.

I wanna ~  /aiwa':n@/  그냥 한단어 처럼 나와야한다.

I wanna / go, leave

I wanna / go home

Im hungry I wanna / eat

Im just wanna / eat it

Im just wanna / sleep

I wanna / sleep in the / bathtube

I wanna / learn a/nother  language

===패턴2

 

I don't wanna / say  *보통 I에 강세를 두고 이야기하지만 don't을 강조해서 말해도 된다.  그냥 한단어 처럼 나와야한다.

I don't wanna / know -- I don't wanna / see  

I don't wanna / go, die

I don't wanna / hit you 때리고 싶지않다 적당히 해라.     

I don't wanna / talk a/bout him

Paul, I don't wanna / upset my /Dad

 

===패턴3

d D d 발음이다.

Do you wanna ~  /douwa':n@/  그냥 한단어 처럼 나와야한다.

Do you wanna / eat?  learn? see it?

Do you wanna /keep this?

Do you wanna / do that?

What do you wanna / do ?

Do you wanna / see me / cry

 

'English > 소리튠' 카테고리의 다른 글

2주 챌린지_블록 훈련 과거형 Did you~?  (0) 2023.12.14
블록훈련3 I have to  (0) 2023.11.30
블록훈련2 Im gonna  (0) 2023.11.29
Posted by useways
,

a: What's in the shopping bag?

b: Oh, it's a shirt I bougth. I'm gonna / get a refund.   [bɔːt] , boat [bout]

     *문장읽을때 주의 I'm gonna 한 의미 블록 get a refund 한 의미 블록이다 읽을때는 강세별로 연결하면서

a: What's wrong with it? -- Is it the -- wrong size? 

b: No, I just don't like it. I wanna get my money back.

Posted by useways
,

a: Are you good at haggling for prices?

b: No, I'm not, -- so I compare prices -- before I go shopping.

a: So, you do your homework -- before you go?

b: Kind of. -- I don't buy high-end products -- that often anyway.

 

Posted by useways
,

https://www.gohackers.com/?c=ielts/ielts_info2/ielts_listening&category=6&mode=view&uid=17050

 

ANCHOR: Welcome to tonight’s Auckland Area News. I’m your anchor, Matt Sands. Next week Auckland will be celebrating the reopening of its oldest theatre in what is widely seen to be a push towards the revival of stage entertainment in New Zealand.

The Queen’s Theatre, originally built in 1857, was the centre of the city’s theatrical community for over a hundred years. During the First and Second World Wars it was a sanctuary for people who needed relief from worries about their loved ones fighting overseas and the grim realities of war. Then, in the 1960s, the increasing popularity and affordability of film pulled audiences out of stage theatres and into big-screen cinemas. Fewer seats being filled meant less money, and the Queen’s Theatre officially closed its doors in 1972.

Fast-forward to about 25 years later when the Auckland Theatre Association, an organisation consisting of Auckland’s most renowned theatrical professionals, began petitioning the city to grant a permit for the theatre’s renovations. Permission was granted in 1998, and a local restoration crew began work.

Progress stalled in 2000, however, due to a lack of funds. Then, in 2009, an anonymous donor provided $650,000 to complete the renovations. Efforts recommenced, and the restoration project was finally finished just last month, in July 2012.

According to Michelle McColl, director of the Auckland Theatre Association, their hope is that reopening the Queen’s Theatre will provide a space for community, creativity, and youth engagement. With Auckland’s rising drug use, there is an urgent need to provide activities that the city’s young people can take part in after school. But more than just activities, theatre groups can provide community and support to those vulnerable to negative peer pressures.

The reopening day next Saturday will include several short performances by theatrical troupes, as well as a speech by Director McColl. An early press release from her office stated that plans for the coming year’s events and activities would be announced at that time. 

But you can be sure that a few items will be on the agenda, not the least of which the development of a Youth Drama Club. Sources have told us that any child between the ages of 12 and 17 who is enrolled at an Auckland public school may participate. The costs of the program will be absorbed by a combination of gifts in kind from the local community and a grant from the New Zealand Youth Association.

There will also be regular plays put on by area theatre groups who will have the option of reserving the space for a small fee of $100 per night. Schools, interest groups, non-profit organisations, and bands may also book the venue, but preference will be given to organisations and groups registered with the Auckland Theatre Association.

All this and more will be explained in detail on Saturday night. The ribbon-cutting ceremony will be held at 5 p.m., and doors will open immediately after. Director McColl’s introductory speech will start at 6 p.m., followed by four short performances of about 20 minutes each. There will be one intermission of 20 minutes, during which beverages and snacks will be sold in the downstairs entrance area.

Those from the general public who wish to attend may purchase tickets from the Auckland Theatre Association’s website at http://www.ata.nz, or visit the Queen’s Theatre box office between the hours of 11 a.m. and 4 p.m. any weekday. Seating is limited, with a maximum capacity of 250 people, so a sold-out event is likely. Advance booking is highly recommended.

If you are unable to make Saturday’s event but would like to contribute to the Queen’s Theatre and its projects, you can contact the box office for information on how to make a donation. For up-to-date information about events and performances, send an e-mail to queenstheatre@ata.nz to subscribe to their mailing list.

Posted by useways
,

Zootopia3

카테고리 없음 2023. 11. 20. 16:51

 Judy, you ever wonder how your mom
 and me got to be so darn happy?
 Nope
 Well, we gave up on our dreams,
 and we settled. Right, Bon?
 Oh, yes. That's right, Stu.
 We settled hard.
 You see, that's the beauty
 of complacency, Jude.
 If you don't try anything
 new, you'll never fail.
 I like trying, actually.
 What your father means, hon, is that it's
 gonna be difficult, impossible even...
 - for you to become a police officer.
 - Right. There's never been a bunny cop.
 - No.
 - Bunnies don't do that.
 - Never.
 - Never.
 Well... Then I guess
 I'll have to be the first one.
 Because I am gonna make
 the world a better place!
 Or, heck, you know. You wanna talk
 about making the world a better place,
 no better way to do it than
 becoming a carrot farmer.
 Yes! Your dad, me,
 your 275 brothers and sisters.
 - We're changing the world.
 - Yeah.
 - One carrot at a time.    //one person at a time 한번에 한사람씩
 - Amen to that.
 Carrot farming is a noble profession.
 You get it, honey?
 I mean, it's great to have dreams.
 Yeah, just as long as you
 don't believe in them too much.
 Where the heck'd she go?

feel at one with the nature 자연과 하나되는 느낌

Posted by useways
,

a: Do you go to department stores often?

b: Not really. They're too expensive.  

   I prefer --  discount stores.

a: What kind of discount stores?

b: Well, I like to go to outlet malls.

   Prices are cheaper there.

Posted by useways
,

a: Do you want to go shopping  this weekend ?

b: That would be great!  I need to ge't new shoes.

a: Good. Where do you typically go -- when you shop for clothes?

b: It depends on -- what I'm buying.

 

go for a walk 

The weather is too bad to go for a walk outside

Maybe you should take a break for a while. get a cup of coffee, go for a walk around the town

I walk my dog once a week 개를 산책 시키다.

It's fun to take a stroll with a dog.

Let's take a stroll in the basement before calling it a day. 문을 닫기전에 지하실을 하번 돌러보자

After lunch, take a stroll to someplace nearby to fend off the sleepiness 졸음을 몰아내고

go for a run = go running

Go is used with activities where the activity is in the -ing form.

We went camping by the lake last summer. Other activities that take 'go' are:

dancing, jogging, running, hiking, riding, swimming, cycling, climbing etc.

go swimming , go hiking 가벼운 산타기

I go hiking once in a week to keep the weight off 체중을 유지하기 위해

 

===자전거관련

riding a bike and cycling have the same meaning.

Riding a bike can mean a ridung a motorcycle as well.

If you mean bicycles though,

 

 

play tennis, play basketball with your buddies, play golf

 

 

Posted by useways
,

We invited some relatvies -- over to our home

My grandmother on my mom's side -- passed away -- last year

 

A: Do you see your relatives often?

B: Not really. We only get together -- during family holidays.

A: I see

B: I did see a lot of my relatives -- at my niece's wedding last week.

    It was nice to see -- all of them

Posted by useways
,

Do you have any kids?

Korea's birthrate is -- among the lowest -- in the world.

I'm thinking of going on a -- childcare leave

 

 

A: When is your baby due?

B: At the end of next month

A: You must be so excited!

B: I am! I can't wait to see -- my baby.

     I'm going on a maternity leave for  -- three months.

 

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1113 035 쇼핑관련 Do you want to go shopping this weekend ?  (0) 2023.11.20
1108 190 친척  (0) 2023.11.08
1107 188 배우자  (0) 2023.11.07
1107 187 형제  (0) 2023.11.07
1107 186 부모님  (0) 2023.11.07
Posted by useways
,

A: Doyou have any plans for the weekend?

B: Yes, I'm having dinner with my in-laws.

A: Oh, that's nice.
B: My brother-in-law is getting married -- next month.

     It's a special dinner to congratulate -- his wedding.

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1108 190 친척  (0) 2023.11.08
1108 189 자녀  (0) 2023.11.08
1107 187 형제  (0) 2023.11.07
1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
Posted by useways
,

A:  Doyou have any siblings?

B: Yes, I have a younger brother. Weare two years apart.

     How about you?

A: Oh, I'm the only child -- in the family

B: I see

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1108 189 자녀  (0) 2023.11.08
1107 188 배우자  (0) 2023.11.07
1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1105 194 발목부상  (0) 2023.11.06
Posted by useways
,

My parents are always very supportive

I have always looked up to my father

My mom and dad are very family-oriented   

 

*발음주의 very에 강세가 안들어갔다.

*발음주의 my에 강세가 안들어간다.

 

A: Your parents -- really seem nice

B: Yes, Iam very close to -- my mom and dad. They are always very loving and caring

A: That's good to hear

B: They have always been -- very supportive and -- family-oriented

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 188 배우자  (0) 2023.11.07
1107 187 형제  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1105 194 발목부상  (0) 2023.11.06
1104 193 골절상  (0) 2023.11.06
Posted by useways
,

get surgery = undergo surgery 수술을 받다

get acupuncture treatment

get cupping treatment

 

He hurt his back and --   seems to have severe pain.

I went to an - oriental doctor -- and acupuncture treatment

I might have to - get surgery -- on my back

 

A: Oh, my Back hurt -- so much. I can't sit up  properly.

B: Why don't you go see a doctor? 

A: I've already done that -- She told me that I might have to undergo surgery

B: Oh no! --

Is it that bad?

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 187 형제  (0) 2023.11.07
1107 186 부모님  (0) 2023.11.07
1105 194 발목부상  (0) 2023.11.06
1104 193 골절상  (0) 2023.11.06
1103 191 베인상처  (0) 2023.11.06
Posted by useways
,

go to an orthopedist  정형외과에 가다

get an X-ray taken

 

 

Why are you limping?

I went to an orthopedist and -- got some crutches 목발

 

A: What are those crutches  for?

B: I twisted my ankle -- while walking down the stairs - yesterday.

A: Oh, no!  Didyou break your foot?

B: No, I think   I just sprained my ankle.

     It'll get better soon. Don't worry.

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1104 193 골절상  (0) 2023.11.06
1103 191 베인상처  (0) 2023.11.06
1102 192 덴상처  (1) 2023.11.02
Posted by useways
,

get a cast / have a cast on 깁스를 하다

 

I borke my arm once When - I was a kid.

My foot swelled up -- a lot

 

A: Oh,no! -You have a cast on your foot!   What happened?

B: I fell down - while riding my bike - I broke my foot.

A: I'm so sorry to hear that.  Howlong - doyou need the -- cast.

B: For over a month. It will take a -- long time to heal.

 

It is very painful.

 

The most common causes of facial swelling arise from a dental or skin infection, or an allergic reaction which can also cause hives, wheezing, and vomiting. Other causes of face swelling include dehydration, hormonal imbalance

 

What can cause swelling of the face?

 

How do I reduce swelling in my face?
What causes face swelling on one side?
What causes swollen face in the morning?

 

face is swollen from toothache

How do you reduce swelling in your face from a toothache?
How long does it take for face swelling to go down from tooth infection?
Can a toothache cause a swollen face? 
Why is my face suddenly red and swollen?
How do you treat a red swollen face?
Why is my cheek swollen and red?
What is the disease where your face swells up?

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1105 194 발목부상  (0) 2023.11.06
1103 191 베인상처  (0) 2023.11.06
1102 192 덴상처  (1) 2023.11.02
Posted by useways
,

get a cut  베이다

cut my finger - on a piece of glass.

I cut my finger - on a knife  - while I was cooking.

It was bleeding and a litter sore

I disinfect the cut  - and put a band-aid on it

 

sore [sɔːr]

  • 1.상처2.염증3.아픈4.화난5.기분 상한

a sore wound ,  sore news

"Fighting will get you nothing except sores and scars,"

Some cold symptoms include coughing, a runny nose, headache, fever and a sore throat.

Time does not always heal old sores. 

  • sore spot약점, 아픈 곳, 남의 감정을 해칠 만한 
  • canker sore작은 궤양, 구내염, 구내미란

A: What happened to your finger?

B: Oh, I got a paper cut

A: Ouch! That must've hurt!

B: It wasn't that bad.

     I just put a band-aid on it to stop the bleeding.

 

what happened to the stolen generation

In the 1900s, many Indigenous children were forcibly removed from their families and communities. It’s estimated that as many as 1 in 3 Indigenous children were taken between 1910 and the 1970s, affecting most Aboriginal and Torres Strait Islander communities in Australia. This all took place under past Australian Government policies.

Taking children away from their homes, families and communities caused a lot of pain and sadness that still exists today. Stolen Generations survivors suffered a huge amount of grief and trauma, losing their connections to family, identity, land, language and culture. These children have become known as the Stolen Generations.

 

 

https://healingfoundation.org.au/resources/who-are-the-stolen-generations/

indigenous 영국[indídʒənəs] 

1.고유의2.토착의3.고유한

 

https://adipo.tistory.com/entry/indigenous-%EC%96%B4%EC%9B%90

 

indigenous 어원, indi[=within]+gen[=birth]+ous → 지역 안에서 태어난

indigenous [indídʒənəs] 고유의, 토착의, 고유한 【어원】 indi[=within]+gen[=birth]+ous → 지역 안에서 태어난 a plant indigenous to South America 남미 원산종의 식물 indigenous workers 현지인 노동자. 잡스9급 PDF 교

adipo.tistory.com

https://m.blog.naver.com/eternity9us/221348913235

 

individual, individually, individualism - 어원, 어원학습, 단어 외우기

individual 뜻 : 개별적인, 개개의, 개인의 (형용사) 개인, 개체 (명사) 발음 : [in 인 di 디 ví...

blog.naver.com

https://softca.tistory.com/939

 

[영어어원사전] 어근 gener-, genit-, gent-로 영어단어 공부하기 (라틴어 어원; gignere, genus, generis, gener

영어어근 gener-는 라틴어 gignere 「출산하다, 아비가 되다, 생산하다(give birth, to beget, produce)」를 어원으로 합니다. 기본적으로 이 어근은 그리스어 genea를 어원으로 하는 gen- 어근과 의미와 철자의

softca.tistory.com

 

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1105 194 발목부상  (0) 2023.11.06
1104 193 골절상  (0) 2023.11.06
1102 192 덴상처  (1) 2023.11.02
Posted by useways
,

A: What's wrong with your hand?

B: I burned it - on a curling iron.

A: Oh, no! - Did you put - ice on it?

B: Yes, but I got a blister - on the burn.

     It will take some time - to fully heal

 

 

=== Something is wrong with my computer, but I don't know how to fix it.

‘What’s the matter?’, ‘What’s up with you?’ 예문

1. ‘You seem worried. What’s the matter?’
– 걱정스러워 보여. 무슨 일 있어?

2. ‘What’s up with you? You’ve been quiet all day.’
– 너 무슨 일이야? 하루 종일 조용하게 있어.

3. ‘What’s the matter? You look upset.’
– 무슨 일 있어? 화난 것 같아 보여.

 

https://m.blog.naver.com/dxsuckit69/220726529487

 

영어를 연습하자! - What's wrong? ; What is wrong? (무슨 일이에요? ; 왜 그래요? ; 뭐가 잘못됐어요?) / She

영어킹 더홍[THE HONG] 홍의성과 함께 영어를 연습하는 시간이에요.   무슨 일이에요?, 왜 그...

blog.naver.com

 

===burn [bəːrn]

   burn easily 햇볕에  타다

   a light burning in the window  창문에 비치고 있는 불빛

   burn with fever 열 나서 화끈거리다

 

타 

  burn gas[a torch burn a finger

  She burned the toast.

  The faster you think, the more calories you burn.

  That attitude really burns me up!  따위 태도는 정말 화가 치밀게 

 

  a burn on the hand 

'English > EBS 매일10분 정면돌파' 카테고리의 다른 글

1107 186 부모님  (0) 2023.11.07
1106 195 허리부상  (0) 2023.11.06
1105 194 발목부상  (0) 2023.11.06
1104 193 골절상  (0) 2023.11.06
1103 191 베인상처  (0) 2023.11.06
Posted by useways
,

JavaScript에는 '없음'를 나타내는 값이 두 개 있는데, 바로 null와 undefined입니다. 두 값의 의미는 비슷하지만, 각각이 사용되는 목적과 장소가 다릅니다.

JavaScript는 값이 대입되지 않은 변수 혹은 속성을 사용하려고 하면 undefined를 반환합니다.

 
let foo;
foo // undefined
 
const obj = {};
obj.prop; // undefined

null은 '객체가 없음'을 나타냅니다. 실제로 typeof 연산을 해보면 아래와 같은 값을 반환합니다.

 
typeof null // 'object'
typeof undefined // 'undefined'

그렇다면 개발자의 입장에서 '없음'을 저장하기 위해 둘 중 어떤 것을 써야 할까요? undefined를 쓴다고 가정해보면, 아래와 같은 코드는 그 의미가 불분명해집니다.

 
let foo; // 값을 대입한 적 없음
let bar = undefined; // 값을 대입함
foo; // undefined
bar; // undefined (??)
let obj1 = {}; // 속성을 지정하지 않음
let obj2 = {prop: undefined}; // 속성을 지정함
obj1.prop; // undefined
obj2.prop; // undefined (??)

비록 undefined가 '없음'을 나타내는 값일지라도, 대입한 적 없는 변수 혹은 속성과, 명시적으로 '없음'을 나타내는 경우를 구분을 할 수 있어야 코드의 의미가 명확해 질 것입니다. 프로그래머의 입장에서 명시적으로 부재를 나타내고 싶다면 항상 null을 사용하는 것이 좋습니다.

다만, 객체를 사용할 때 어떤 속성의 부재를 null을 통해서 나타내는 쪽보다는, 그냥 그 속성을 정의하지 않는 방식이 간편하므로 더 널리 사용됩니다.

 
// 이렇게 하는 경우는 많지 않습니다.
{
name: 'Seungha',
address: null
}
 
// 그냥 이렇게 하는 경우가 많습니다.
{
name: 'Seungha'
}
 
// 어쨌든 이렇게 하지는 말아주세요.
{
name: 'Seungha',
address: undefined
}

Null Check

null이나 undefined는 어떤 변수에도, 어떤 속성에도 들어있을 수 있기 때문에 우리는 코드를 짤 때 값이 있는 경우와 없는 경우 (즉 null 혹은 undefined인 경우)를 모두 고려해서 코드를 짜야 할 필요가 있습니다. 어떤 값이 null 혹은 undefined인지 확인하는 작업을 null check라고 합니다. null check는 간단히 등호를 이용해서 할 수 있습니다.

 
function printIfNotNull(input) {
if (input !== null && input !== undefined) {
console.log(input);
}
}

그런데 매 번 위처럼 긴 비교를 해야 한다는 것은 골치아픈 일입니다. 사실은 위 if 구문 안에 있는 식을 다음과 같이 줄여 쓸 수 있습니다.

 
// 아래 세 개의 식은 완전히 같은 의미입니다.
input !== null && input !== undefined;
input != null;
input != undefined;
 
// 아래 세 개의 식은 완전히 같은 의미입니다.
input === null || input === undefined;
input == null;
input == undefined;

이제까지 세 글자 짜리 등호만을 소개했는데, 사실 JavaScript에는 두 글자 짜리 등호도 있습니다. 각각의 공식적인 명칭은 strict equality comparison operator, abstract equality comparison operator 입니다. 이름에서도 알 수 있듯이, 대개 ===는 값이 정확히 같을 때 true라는 결과값을 반환하고, ==는 그렇지 않을 때가 많습니다. 그래서 보통의 경우 ===를 사용하는 것이 권장되는 편입니다.

다만 null check를 할 때 만큼은 ==를 쓰는 것이 편리합니다. 아래 예제를 통해 설명하겠습니다.

==와 === 두 연산자는 null과 undefined에 대해서 아래와 같이 동작합니다.

 
null === undefined; // false
null == undefined; // true
 
null == 1 // false
null == 'hello' // false
null == false // false
 
undefined == 1 // false
undefined == 'hello' // false
undefined == false // false

즉, == 연산자는 한 쪽 피연산자에 null 혹은 undefined가 오면, 다른 쪽 피연산자에 null 혹은 undefined가 왔을 때만 true를 반환하고, 다른 모든 경우에 false를 반환합니다.

따라서 null check를 할 때 만큼은 ==를 사용하는 것이 편합니다. 다른 모든 경우에는 ===를 사용하는 것이 좋습니다.

===와 ==에 대한 자세한 내용은 연산자 더 알아보기 챕터에서 다룹니다.

 

출처 : https://helloworldjavascript.net/pages/160-null-undefined.html

Posted by useways
,

Undefined? (null이랑 같은건가?)

자바스크립트에서는 (자바 같은 언어와 달리) 변수의 자료형을 별도로 표기하지 않고, 변수에 담기게 되는 값에 따라 자료형이 결정되게 됩니다. 이러한 특징때문에 undefined라는 상태를 다루게 되는데, 'undefined'라는 키워드는 해당 변수의 자료형이 정해지지 않았음을 나타냅니다.

 

  • undefiend : 변수는 존재하나, 어떠한 값으로도 할당되지 않아 자료형이 정해지지(undefined) 않은 상태입니다.
  • null : 변수는 존재하나, null 로 (값이) 할당된 상태. 즉 null은 자료형이 정해진(defined) 상태입니다.
var var1; //undefined (어떤 값도 할당되지 않아서 자료형을 알 수 없음)
var var2 = null; //null (null로 (값이) 할당되어서 자료형을 알 수 있음 - null의 자료형은 object다.)

undefined와 null은 '값이 없다' 라는 점에서 유사하지만 엄밀히 말하면 다른 개념입니다. 

 

(+ typeof 연산자로 타입을 확인해보면 undefined는 undefined 타입이, null은 object 타입이라고 표시됩니다.)

 

undefined == null 은 true 나온던데?

하지만 자바스크립트 undefined == null을 비교하면 true값이 나오게 됩니다. 이는 자바스크립트 == 연산자의 자동 형변환 기능때문입니다.

 

자바스크립트에서 숫자 1과 문자 '1'을 비교 할 때 == 연산자를 사용하면 true가 나오지만, 타입까지 엄격히 검사하는 === 연산자를 사용하면 false가 나오게 됩니다.

1 == '1' //true
1 === '1' //false

 

이와 유사하게 undefined와 null도 == 연산자와 === 연산자의 결과가 다르게 나옵니다.

undefined == null //true
undefined === null //false

 

출처 : https://siyoon210.tistory.com/148

 

참고

Posted by useways
,

Javascript의 객체에 특정 속성이 존재하는지 체크하는 방법 3가지를 소개합니다.

출처: https://hianna.tistory.com/420

 

1. hasOwnProperty() 함수

 

 

 

hasOwnProperty 함수는 파라미터로 전달된 property(속성)가 객체에 존재하면 true를 리턴하고,

그렇지 않으면 false를 리턴합니다.

 

 

 

2. in 연산자 사용하기

 

in 연산자도 hasOwnProperty 함수와 비슷하게 객체에 프로퍼티가 있으면 true를 리턴하고, 

그렇지 않으면 false를 리턴합니다.

 

 

그렇다면,

hasOwnProperty() 함수와 in 연산자의 차이는 무엇일까요?

hasOwnProperty() vs in 연산자 차이

 

toString 메소드는 모든 객체가 공통적으로 가지는 속성입니다.

hasOwnProperty 메소드는, 이렇게 객체로부터 상속받은 속성을 체크하면 false를 리턴합니다.

in 연산자의 경우에는, toString과 같이 객체로부터 상속받은 속성을 체크하면 true를 리턴합니다.

 

 

 

3. undefined와 비교하기

 

'person.age'와 같이, 객체에 존재하지 않는 속성(property)에 접근하면 undefined가 리턴됩니다.

이런 특징을 이용해서, 객체에 특정 속성이 존재하는지 여부를 체크할 수 있습니다.

 

주의할 점

 

위 예제의 경우, person 객체에 age 속성이 존재하지만, 그 값이 undefined로 정의되어 있습니다.

이 경우, person.age를 undefined 값과 비교하면 true를 리턴합니다.

따라서, 이 경우에는 원하는 결과와 다른 값을 얻게 됩니다.

실제로 속성이 존재하지만, 속성값이 undefined이기 때문에, 

위 코드에서는 마치 age 속성이 존재하지 않는 것과 같은 결과를 얻게됩니다.

 


 

객체에 특정 속성이 존재하는지 여부를 체크하는 방법 3가지를 알아보았습니다.

 

 정리 

1. hasOwnProperty() 함수

 - toString과 같은 객체로부터 상속받은 속성은 체크되지 않습니다.

 

2. in 연산자 사용하기

 - toString과 같은 객체로부터 상속받은 속성까지 모두 체크됩니다.

 

3. undefined와 비교하기

 - 속성 값이 undefined인 경우, 속성이 존재하지 않는 것처럼 체크됩니다.

 

 

 

Posted by useways
,

▶들어가기 전

자바스크립트는 느슨한 타입을 가진 언어이기 때문에 관대한 타입 변환을 수행합니다.

이런 부분은 많은 개발자가 자바스크립트를 이해하기 힘들어하고 싫어하는 이유이기도 합니다.

앞으로 자바스크립트의 타입 변환 규칙을 ECMAScript에 명시된 명세를 기준으로 알아볼 것입니다.

이 내용들은 어떤 식으로 타입 변환을 제어하는 것이 좋을지 판단할 때 큰 도움이 될 것입니다.

또한, 자바스크립트의 꽃이라고도 할 수 있는 함수의 선언과 호출 방법 그리고 this 바인딩에 대해 다룰 것입니다.

언급한 내용 모두 자바스크립트에서 혼란스럽게 여겨지지만, 알아보고 나면 생각보다 간단한 규칙이 있다는 것을 이해할 수 있을 것입니다.

 

▶타입 변환

자바스크립트에서 타입 변환을 이해하는 것은 매우 중요합니다.

어떤 경웨 데이터 타입 변환이 발생하는지를 알아야, 의도한 대로 동작하는 코드를 작성할 수 있습니다.

 

자바스크립트의 타입 변환은 명시적 강제 변환, 암시적 강제 변환 두 가지가 있습니다.

둘의 차이는 명확합니다.

명시적 강제 변환은 의도적인 타입 변환을 나타내는 것이고, 암시적 강제 변환은 표현식의 평가 중 타입이 변환되는 것입니다.

 

1) 명시적 강제 변환

명시적 강제 변환은 명확하게 의도를 갖고 타입을 변환하는 것입니다.

문자열, 숫자, 불리언 타입 별로 몇 가지 방법이 있습니다.

▷문자열로 변환

문자열로 변환하는 가장 간단한 방법은 [랩퍼 객체]에서 보았던 String() 함수를 호출하는 것입니다.

new 키워드를 붙이지 않고 String() 함수를 호출하면 랩퍼 객체를 생성하는 것이 아니라 타입 변환 함수로 동작합니다.

console.log(String(3)); // '3'
console.log(String(false)); // 'false'
console.log(String(null)); // 'null'

그렇다면 다른 타입에서 문자열 타입으로의 변환은 어떤 기준으로 이뤄지는 것일까요?

다음 표에서 볼 수 있듯이 타입별로 문자열 변환 방법이 정해져 있습니다.

ECMAScript에서는 이 규칙을 ToString() 추상 연산이라고 명시하고 있으며, 명시적이든 암시적이든 문자열로 변환될 때 수행됩니다.

 

[NOTE]

정확히 말하면 String() 함수는 심볼 이외의 타입에 대해서 ToString 추상 연산을 따릅니다.

심볼 타입의 경우 SymbolDescriptiveString 연산을 통해 변환됩니다.

타입 문자열 변환 결과
undefined 'undefined'
null 'null'
boolean true → 'true', false → 'false'
number Number.toString() 변환 결과(3 → '3')
Symbol 문자열로 변환을 시도하는 경우 TypeError 발생
BigInt BigInt.toString()의 결과 반환(3n → '3n')
object 객체를 원시 타입으로 변환한 후 다시 한번 ToString 추상 연산을 수행한 값을 반환합니다.
객체를 원시 타입으로 변환하는 과정을 정확히는 ToPrimitive 추상 연산이라고 합니다.
const boolVal = true;
const numVal = 2;

console.log(String(boolVal)); // 'true'
console.log(String(numVal)); // '2'

 

[NOTE]

심볼은 연산을 통해 문자열 또는 숫자로 변환될 경우 TypeError가 발생합니다.

이는 심볼이 변환되어 객체의 다른 프로퍼티에 접근하는 것을 방지하기 위해서입니다.

myobject['__' + Symbol('key')]; // TypeError

또 다른 문자열 변환 방법은 toString() 메서드를 사용하는 것입니다.

const num = 4;
console.log(num.toString()); // '4'
  • String()과 toString()의 차이점

앞서 살펴본 String()과 toString()은 대부분 동일한 결과를 반환하지만, 그렇지 않은 경우도 있습니다.

null undefined 타입이 그에 해당합니다.

console.log(String(null)); // 'null'
console.log(String(undefined)); // 'undefined'

undefined.toString(); // TypeError 발생
null.toString(); // TypeError 발생

예제 코드의 결과는 당연합니다.

null과 undefined 타입은 값이 비어 있음, 할당되지 않은 상태를 나타내는 원시 타입이므로  toString() 메서드를 호출할 수 있다는 논리상 말이 되지 않습니다.

또한 이 타입들은 객체가 아니기 때문에 객체에서 사용할 수 있는 프로퍼티들을 사용할 수 없는 것이 옳습니다.

반면, String() 함수의 경우에 심볼 이외의 모든 타입이 위에서 정의된 규칙을 정확하게 따르기 때문에 문자열로 명시적 강제 변환을 하고 싶은 경우에는 toString() 메서드보다는 String() 함수를 사용하는 것이 더 적합합니다.

 

▷숫자로 변환

숫자로의 변환도 문자열과 유사하게 Number() 함수를 호출하여 변환하는 방법이 있으며, BigInt 타입을 제외한 데이터는 ECMAScript의 ToNumber 추상 연산 명세를 기준으로 변환됩니다.

 

[NOTE]

숫자로의 변환 시 정확히는 ToNumber 추상 연산 명세를 기준으로 하여, 여기서 몇 가지 단계를 거쳐 ToNumber 추상 연산을 실행합니다.

타입 숫자 변환 결과
undefined NaN
null +0
string 숫자로 변경이 불가능한 값 → NaN, 숫자형 문자열 → 숫자
boolean true → 1, false → 0
Symbol 숫자로 변환을 시도하는 경우 TypeError 발생
BigInt 숫자로 변환을 시도하는 경우 TypeError 발생
object 객체를 원시 타입으로 변환한 후 다시 한번 ToNumber 추상 연산을 수행한 값을 반환
console.log(Number('3')); // 3
console.log(Number(true)); // 1
console.log(Number(null)); // 0

[NOTE]

BigInt 타입은 연산 중 숫자로 변환되는 것을 방지하기 위해 TypeError를 발생시킵니다.

BigInt 타입은 숫자 타입과는 다르게 큰 정수(안전한 숫자 타입의 범위를 벗어나는 정수)의 연산을 위해 나온 타입이기 때문에 숫자와는 타입이 구분되어야 합니다.

  • parseInt() 함수

숫자로 변환하는 또 다른 방법으로는 parseInt() 함수를 이욯하는 방법이 있습니다.

다만, parseInt() 함수는 문자열만 대상으로 변환합니다.

값이 문자열이 아닌 경우에는 해당 값을 문자열로 변환한 후 사용합니다.

문자열의 변환 과정은 ToString 추상 연산 과정을 따릅니다.

console.log(parseInt('10', 10)); // 10
console.log(parseInt('-1', 10)); // -1

parseInt() 함수의 두 번재 인자는 기수를 의미합니다.

예제 코드는 기수를 10으로 지정하였디 깨문에 10진수를 기준으로 문자열을 숫자로 변환합니다.

기수를 생략하면 첫 번째 인자를 기준으로 추정하여 변환하므로 의도하지 않은 결과가 나올 수 있습니다.

버그를 만들고 싶지 않다면 반드시 기수를 지정하여 사용하길 권장합니다.

 

parseInt() 함수는 Number() 함수와는 달리 인내심을 가지고 끝까지 변환을 수행합니다.

console.log(Number('10A', 10)); // NaN
console.log(parseInt('10A', 10)); // 10

Number() 함수의 경우는 숫자로 변경 불가능한 문자가 있으면 곧바로 NaN을 반환하지만, parseInt() 함수는 변경 불가능한 문자가 나타날 때까지 최대한 숫자로 변환하여 결과를 반환합니다.

 

▷불리언으로 변환

Boolean도 ECMAScript의 ToBoolean 추상 연산에 따라 타입을 변환합니다.

타입 불리언 변환 결과
undefined false
null false
string 빈 문자열 → false, 그 외 문자열 → true
number +0, -0, NaN → false, 그 외 숫자 → true
Symbol true
BigInt 0n → false, 그 외 BigInt 정수 → true
object true

[논리 연산자]에서 살펴본 falsy 값이 기억나시나요?

falsy 값의 기준은 위의 표에 정의된 규칙을 그대로 따른 것입니다.

불리언 타입으로의 변환은 Boolean() 함수를 호출하는 방법과 이중 부정 연산자를 사용하는 방법이 있으며, 두 연산은 모두 동일한 결과를 반환합니다.

const a = null;
const b = 0;
const c = '';
const d = {};
const e = [];

console.log(Boolean(a)); // false
console.log(Boolean(b)); // false
console.log(Boolean(c)); // false
console.log(Boolean(d)); // true
console.log(Boolean(d)); // true

console.log(!!a); // false
console.log(!!b); // false
console.log(!!c); // false
console.log(!!d); // true
console.log(!!d); // true

 

2) 객체의 원시 타입 변환

암시적 강제 변환을 살펴보기 전에 객체의 원시 타입 변환에 대해 먼저 알아보겠습니다.

객체의 원시 타입 변환은 문자열로 변환, 숫자로 변환 두 가지로 나눌 수 있습니다.

그리고 이 과정에서 valueOf() toString() 메서드가 중요한 역할을 합니다.

▷문자열로 변환

객체가 문자열로 변환되는 과정을 아래와 같은 단계로 진행됩니다.

1단계

객체에 정의된 toString() 메서드를 호출합니다. 별도로 정의한 toString() 메서드가 없다면 기본적으로 Object.prototype.toString() 메서드를 실행합니다. Object.prototype.toString() 메서드는 결과 값으로 '[Object object]' 문자열을 반환합니다.

2단계

1단게의 결과가 원시 타입이라면 그 결과를 문자열로 변환하여 반환하고, 그렇지 않다면 valueOf() 메서드를 호출합니다. valueOf() 메서드 역시 객체에 별도로 정의한 valueOf() 메서드가 없다면 기본적으로 Object.prototype.valueOf() 메서드를 실행합니다.

3단계

valueOf() 메서드의 결과 값이 원시 타입이라면 그 결과를 문자열로 변환하여 반환하고, 그렇지 않다면 TypeError가 발생합니다.

console.log(String({})); // '[Object object]'

빈 객체가 '[Object object]' 문자열로 변환되었습니다.

'[Object object]'가 어떻게 나온 결과 값인지 의아할 수 있을 것입니다.

하지만 이 결과는 위의 단계를 정확하게 따른 결과입니다.

1단계

빈 객체를 문자열로 변환하기 위해 객체의 toString() 메서드를 호출합니다. 직접 정의한 toString() 메서드가 없기 때문에 Object.prototype.toString() 메서드를 실행합니다.

2단계

1단계의 결과값은 '[Object object]' 문자열이며 원시 타입이기 때문에 이 결과를 반환합니다.

 

빈 객체의 toString() 메서드의 결과값이 '[Object object]' 문자열 원시 타입이기 때문에 이 결과를 반환하는 것입니다.

또한 toString() 메서드의 결과값이 원시 타입이기 때문에 valueOf() 메서드는 호출되지 않습니다.

 

▷숫자로 변환

객체가 숫자로 변환되는 과정 역시 단계별로 보겠습니다.

1단계

객체에 정의된 valueOf() 메서드를 호출합니다. 별도로 정의한 valueOf() 메서드가 없다면 기본적으로 Object.prototype.valueOf() 메서드를 실행합니다. Object.prototype.valueOf() 메서드는 결과 값으로 객체를 그대로 반환합니다.

2단계

1단계의 결과가 원시 타입이라면 그 결과를 숫자로 변환하여 반환하고, 그렇지 않다면 toString() 메서드를 호출합니다. 별도로 정의한 toString() 메서드가 없다면 기본적으로 Object.prototype.toString() 메서드를 실행합니다.

3단계

toString() 메서드의 결과 값이 원시 타입이라면 그 결과를 숫자로 변환하여 반환하고, 그렇지 않다면 TypeError가 발생합니다.

 

valueOf() 메서드를 먼저 호출한 후 toString() 메서드를 호출하는 것을 제외하면 객체를 문자열로 변환하는 과정과 유사합니다.

console.log(Number({})); // NaN

1단계

빈 객체를 숫자로 변환하기 위해 객체의 valueOf() 메서드를 호출합니다. 직접 정의한 valueOf() 메서드가 없기 때문에 Object.prototype.valueOf() 메서드를 실행합니다.

2단계

1단계의 결과값은 원시 타입이 아닌 빈 객체를 그대로 반환하기 때문에 toString() 메서드를 호출합니다.

3단계

toString() 메서드의 결과값은 '[Object object]' 문자열이며 원시 타입이기 때문에 이 결과를 숫자로 변환합니다. '[Object object]' 문자열은 숫자로 변환할 수없는 값이기 때문에 최종적으로 NaN을 반환합니다.

 

▷객체의 valueOf()와 toString()

만약 valueOf()와 toString() 메서드를 직접 정의한 경우는 어떤 결과 값을 반환할까요?

const obj = {
	valueOf() {
   		return 1;
    },
   	toString() {
    		return 'toString';
    }
}

console.log(String(obj)); // 'toString'
console.log(Number(obj)); // 1

객체의 valueOf()와 toString() 메서드를 직접 정의하면 타입 변환의 결과도 달라짐을 알 수 있습니다.

그렇기 때문에 valueOf()와 toString() 메서드를 재정의할 때는 주의해야 합니다.

 

배열, Date, 정규식과 같은 특수한 객체들은 자체적인 toString() 또는 valueOf() 메서드를 가지고 있습니다.

예를 들어 배열을 문자열로 변경하면 배열의 원소를 콤마(,)로 구분하여 문자열로 병합합니다.

 

3) 암시적 강제 변환

암시적 강제 변환은 연산 중에 내부적으로 타입을 변환하는 것입니다.

명시적 강제 변환과 달리 코드에서 명확하게 타입을 변환하는 것인지 알기 어렵습니다.

많은 개발자가 자바스크립트를 좋아하지 않는 이유 중 하나이며, 초보 개발자들이 가장 헷갈려 하는 부분이기도 합니다.

하지만 암시적 강제 변환 역시 ECMAScript 명세의 기준대로 정확하게 동작하고 있습니다.

이 글에서 자바스크립트의 타입 변환은 명확한 기준이 있다는 점이 전달되기 바랍니다.

 

암시적 강제 변환은 타입이 아닌 연산자를 기준으로 살펴보겠습니다.

▷덧셈 연산자

덧셈 연산자는 숫자 연산이나 문자열을 병합할 때 사용하는 것이라고 생각할 수 있습니다.

하지만 덧셈 연산자는 몇 가지 특징이 있습니다.

 피연산자 중 하나가 문자열 타입인 경우 나머지 타입도 문자열로 변환하여 병합합니다.

// 문자열과 숫자의 덧셈 연산은 숫자를 문자로 변환하여 병합합니다.
console.log(1 + ''); // '1'

[NOTE]

String()과 a + ''의 문자열 변환은 차이가 있습니다. 피연산자의 타입이 객체인 경우 String() 함순느 객체의 toString(), valueOf()의 순서로 메서드를 호출하여 결과를 변환하며, a+''는 valueOf(), toString()의 순서로 호출된 결과를 반환합니다.

 

 피연산자 중 하나가 객체이며 문자열로 변환 가능한 경우 문자열로 변환하여 연산합니다.객체의 문자열 변환 과정은 문자열로 변환에서 설명한 과정과 동일합니다.

// 빈 객체는 '[Object object]' 문자열로 변환이 가능하므로 숫자 1을 문자열로 변환하여 두 문자열을 병합합니다.
console.log(1 + {}); // '1[Object object]'

 

 피연산자가 모두 문자열과 객체가 아닌 경우 숫자로 변환하여 연산합니다. 만약 변환 결과의 타입이 각각 다른 경우 TypeError가 발생합니다.

// 피연산자 중 객체나 문자열이 없기 때문에 true를 숫자로 변환하여 연산합니다.
console.log(1 + true); // 2

보통 숫자 연산에 사용하던 덧셈 연산자에 생각보다 많은 타입 변환 규칙이 존재한다는 것을 알 수 있습니다.

처음 보면 이게 뭐지? 라고 생각할 수 있지만 위의 세 가지 규칙만 이해하면 어떻게 동작할지 알 수 있습니다.

ECMAScript 명세에는 더 세부적인 단계가 있지만, 위의 세 가지 규칙만 잘 이해해도 덧셈 연산자를 올바르게 사용하는데 큰 문제가 없을 것입니다.

 

▷동등 연산자

앞서 [관계형 연산자]에서 동등 연산자의 가장 큰 특징은 암시적 강제 변환을 허용하는 것이라고 하였습니다.

물론 피연산자의 타입이 서로 같은 경우에는 변환하지 않습니다.

 

동등 연산자가 어떤 규칙에 의해 동작하는지 살펴봅시다.

 피연산자 중 하나는 문자열, 하나는 숫자인 경우 문자열을 숫자로 변환하여 동등함을 비교합니다.

// 문자열 '1'을 숫자로 변환하여 동등함을 판단합니다.
console.log(1 == '1') // true

 

 피연산자 중 하나는 문자열, 다른 하나는 BigInt인 경우 문자열을 BigInt로 변환하여 동등함을 비교합니다.

// 문자열 '1'을 BigInt로 변환하여 동등함을 판단합니다.
console.log(1n == '1'); // true

 

 피연산자 중 하나는 null, 다른 하나는 undefined인 경우 동등하게 판단합니다.

console.log(null == undefined); // true
console.log(undefined == null); // true

 

 피연산자 중 하나가 불리언일 경우 불리언을 숫자로 변환하여 동등함을 비교합니다.

// 불리언 true를 숫자로 변환하여 비교합니다.
console.log(true == 1); // true

 

 피연산자 중 하나는 객체, 다른 하나가 문자열, 숫자, BigInt, 심볼 중 하나일 경우 객체를 원시 타입으로 변환하여 동등함을 비교합니다.

// 빈 객체를 원시 타입으로 변환한 후 비교합니다.
console.log('[Object object]' == {}); // true

 

 피연산자 중 하나는 숫자, 다른 하나는 BigInt인 경우 내부적인 숫자 비교 알고리즘에 따라 비교한 결과를 반환합니다.

console.log(1 == 1n); // true

 

동등 비교를 하는 과정에서 다양한 암시적 강제 변환이 일어나는 것을 알 수 있습니다.

규칙들을 하나하나 살펴보면 명확한 기준이 있고 이해하기 어렵지 않지만, 타입 변환으로 인해 가독성이 떨어지는 경우가 있습니다.

console.log(true == '1'); // true

true와 문자열 '1'은 전혀 다른 타입으로 동등 비교 시 false가 나올 것 같지만 그렇지 않습니다.

불리언 true는 숫자 1로 변환되어 문자열 '1'과 비교하게 되고, 이 과정에서 문자열 '1'은 숫자 1로 변환되어 최종적으로 숫자 1과 1을 비교하게 됩니다.

위에서 설명한 변환 규칙을 충실히 따른 결과이지만 확실히 가독성이 떨어집니다.

이런 경우에는 명확하게 엄격한 동등 연산자를 사용하는 것이 가독성에 훨씬 좋습니다.

그럼 헷갈리게 동등 연산자를 사용하지 말고 엄격한 동등 연산자만 사용하는게 좋은 것 아닌가요?

하지만 동등 연산자도 무조건 나쁜 것만은 아닙니다.

function isEmpty(a) {
	if (a == null) {
    		//...
    }
}

특정 값의 비어 있음을 판단하기 위해 동등 연산자를 사용하였습니다.

동등 연산자는 null과 undefined를 동등하게 보기 때문에 두 경우의 수를 모두 편리하게 찾아낼 수 있습니다.

 

동등 연산자는 코드 가독성을 위해 팀원들과 컨벤션을 정하여 사용하는 것이 좋습니다.

"우리 팀에서는 암시적 강제 변환을 허용하지 않겠다!"는 결정이 나면 안전하게 엄격한 동등 연산자만 사용하면 됩니다.

반면, 만약 팀 내에서 명확한 기준을 가지고 동등 연산자를 효율적으로 사용할 수 있다면 동등 연산자도 그 팀에서는 충분히 좋은 역할을 할 수 있습니다.

그리고 이러한 판단을 할 수 있으려면 적어도 앞서 설명한 규칙들은 알고 있어야 합니다.

 

▷비교 연산자

비교 연산자는 숫자 데이터의 대소 비교에서 사용하는 경우가 대부분일 것입니다.

하지만 비교 연산자 역시 동등 연산자처럼 피연산자가 서로 다른 타입인 경우 암시적 강제 변환이 발생합니다.

ECMAScript 명세는 a < b 연산 기준으로 설명하고 있기 때문에 이 글에서도 이 기준을 따라 알아보겠습니다.

비교 연산자는 크게 문자열 데이터의 비교, 그 이외의 경우 두 가지로 나누어져 있습니다.

다만, 피연산자가 객체인 경우 먼저 객체를 원시 타입으로 변환한 후 비교합니다.

변환된 결과가 모두 문자열이라면 문자열 비교를 하고 이외에는 문자열 외의 비교 규칙에 따라 비교합니다.

  • 문자열 비교

문자열 비교는 각 문자를 알파벳 순서로 비교합니다.

또한 왼쪽에서부터 문자 단위로 비교합니다. 즉 '1'과 '04' 로 보았을 때, 왼쪽 가장 처음 문자열 '1'과 '0'을 비교했을 때 이미 왼쪽이 더 큼을 알 수 있습니다.

console.log('a' < 'b'); // true

// 왼쪽에서부터 문자 단위로 비교한다는 것을 주의하세요. 왼쪽부터 '1'과 '0'을 먼저 비교하고 그 다음 문자를 비교합니다.
console.log('1' < '04') // false

피연산자가 배열인 경우를 알아봅시다.

console.log(['a'] < ['b']); // true

배열은 각각 'a', 'b' 문자열로 변환되기 때문에 문자열끼리의 비교를 수행합니다.

 

  • 문자열 외의 비교

문자열끼리의 비교가 아닌 그 외의 경우는 아래와 같은 규칙으로 동작합니다.

① 피연산자 중 하나는 문자열, 다른 하나는 BigInt인 경우 문자열을 BigInt로 변환하여 비교합니다.

// 문자열 '1'을 BigInt로 변환하여 비교합니다.
console.log('1' < 2n); // true

 

② 피연산자를 모두 숫자로 변환하여 비교합니다. 만약 피연산자 중 하나는 숫자, 다른 하나는 BigInt인 경우 내부적인 숫자 비교 알고리즘에 의해 비교를 수행합니다.

// 불리언 true를 숫자로 변환합니다.
console.log(1 < true); // false

// 숫자와 BigInt는 내부 숫자 비교 알고리즘에 의해 비교됩니다.
console.log(1n < 2); // true

 

  • 비교 연산과 타입 변환

비교 연산은 동등 연산과 달리 엄격한 비교 연산자 같은 표현식은 존재하지 않습니다.

 다른 타입 간의 비교 연산에서 암시적인 강제 연산을 막을 수 없습니다.

하지만 동등 연산과 달리 비교 연산은 서로 다른 타입에 대해 사용할 일이 드물고, 객체나 배열을 원시 타입과 비교하는 일도 거의 없습니다.

// 아래와 같은 비교 연산 코드는 실제로 거의 사용하지 않을 것입니다.
const a = '1';
const b = ['02'];

if (a < b) {
	// ...
}

만약 서로 다른 타입을 대상으로 비교 연산자를 사용한다면, 명시적 강제 변환을 통해 변환한 후 사용하는 것이 안전합니다.

const a = '1';
const b = ['02'];

if (Number(a) < Number(b)) {
	// ...
}

Number() 함수를 사용하여 모두 숫자로 변환한 후 비교합니다.

이처럼 다른 타입의 비교 연산 명시적 타입 변환을 통해 동일한 타입으로 변환한 후 실행하는 것이 안전합니다.

 

▷조건 표현식과 논리 연산자

조건 표현식에서 암시적 강제 변환은 아주 흔하게 사용됩니다.

모든 값은 불리언으로 변환되어 조건 표현식에서 평가됩니다.

빈 문자열, null, undefined 등 falsy한 값을 필터링하기 위해 많이 사용하며 명시적 강제 변환보다 더 많이 사용됩니다.

const a = 0;
const b = 'javascript';
const c = null;

if (a) {
	console.log('호출되지 않음');
}

while (b) {
	console.log('thuthy');
   	break;
}

console.log(c ? 'truthy' : 'falsy'); // 'falsy'

조건 표현식에서의 암시적 강제 변환은 Boolean() 함수나 이중 부정 연산자를 사용하여 명시적 강제 변환을 수행하는 것보다 훨씬 간결하게 조건식을 표현할 수 있습니다.

  • 논리 연산자(&&, ||)

자바스크립트의 논리 연산자는 단락 평가 방식을 따릅니다.

이는 다른 프로그래밍 언어에서도 쉽게 볼 수 있는 동작입니다.

하지만 자바스크립트의 논리 연산자는 특이한 점이 있습니다.

논리 연산자의 결과 값이 불리언 타입이 아닐 수 있다는 것입니다.

그럼 어떤 값이 결과 값이 되는 걸까요?

결과 값은 아래와 같은 규칙을 따라 반환됩니다.

 

&& 논리 연산자는 첫 번째 피연산자의 값이 true로 평가되는 경우 두 번째 피연산자의 값을 반환하고, false로 평가되면 첫 번째 피연산자의 값을 반환합니다.

|| 논리 연산자는 첫 번째 피연산자의 값이 true로 평가되는 경우 첫 번째 피연산자의 값을 반환하고, false로 평가되면 두 번째 피연산자의 값을 반환합니다.

const a = null;
const b = 'javascript';
const c = 1;

console.log(a && b); // null
console.log(b || c); // 'javascript'

&& 연산의 결과 값이 null인 이유부터 단계별로 알아보겠습니다.

 

1단계

&& 논리 연산자는 첫 번째 피연산자 a부터 평가합니다.

2단계

첫 번째 피연산자 a는 불리언 값이 아니므로 암시적 타입 변환을 통해 불리언 값으로 변환됩니다. null은 falsy 값이기 때문에 false로 변환됩니다.

3단계

a의 평가 결과가 false이기 때문에 단락 평가 방식에 따라 다음 피연산자인 b는 평가하지 않습니다.

4단계

최종적으로 피연산자 a의 값을 반환합니다.

 

&& 연산자의 첫 번째 피연산자가 false로 평가되어 첫 번째 피연산자의 값인 null을 반환합니다.

이 과정은 위에서 설명한 && 논리 연산자의 규칙과 동일함을 알 수 있습니다.

|| 연산의 결과 값이 나온 이유도 단계별로 알아보겠습니다.

 

1단계

|| 논리 연산자는 첫 번째 피연산자 b부터 평가합니다.

2단계

첫 번째 피연산자 b는 불리언 값이 아니므로 암시적 타입 변환을 통해 불리언 값으로 변환됩니다. 'javascript' 문자열은 truthy 값이기 때문에 true로 변환됩니다.

3단계

b의 평가 결과가 true이기 때문에 단락 평가 방식에 따라 다음 피연산자인 c는 평가하지 않습니다.

4단계

최종적으로 피연산자 b의 값을 반환합니다.

 

마찬가지로 위에서 설명한 || 논리 연산자의 규칙과 동일한 결과를 반환합니다.

 

  • 논리 연산자의 활용

앞서 설명한 논리 연산자의 특징은 디폴트 값을 설정하거나 조건에 따라 함수를 실행할 때 유용합니다.

function setDefault(a) {
	return a || 'default string';
}

setDefault() 함수는 a의 값이 falsy 값이 경우 'default string'이라는 문자열을 디폴트 값으로 설정합니다.

const a = 'javascript';

function doSomething() {
	// ...
}

a && doSomething();

위 예제 코드는 피연산자 a가 truthy 값인 경우에만 doSomething() 함수를 실행합니다.

만약 React를 사용해 보았다면 이런 코드가 익숙할 것입니다.

컴포넌트를 조건에 따라 렌더링할 때 자주 사용하는 표현식입니다.

 

falsy 값이 아닌 null, undefined처럼 값이 비어 있는 경우에만 디폴트 값을 설정하고 싶을 때도 있을 것입니다.

그런 경우에는 || 연산자가 아닌 ES2020에서 등장한 null 병합(nullish coalescing) 연산자를 사용할 수 있습니다.

const a = '';

// a가 null, undefined인 경우만 'default' 문자열이 b의 값으로 할당됩니다.
const b = a ?? 'default';

 

 

출처: http://doeunn.tistory.com/31

Posted by useways
,

1. slice(시작인덱스, 종료인덱스) : 시작인덱스부터 종료인덱스-1까지 반환

* slice의 시작 인덱스 값 > 종료 인덱스 값 이면 작동하지 않는 것에 주의하자!

 <script>
    let txt = "My name is Hyeppy";

    console.log(txt.slice(1, 3)); //name
    console.log(txt.slice(3, 1)); // 작동하지 않는다.
    console.log(txt.slice(2)); // name is Hyeppy
    console.log(txt.slice()); // My name is Hyeppy
 </script>

 


2. substring(시작인덱스, 종료인덱스) : 시작인덱스부터 종료인덱스-1까지 반환

* slice와 달리 substring은 시작 인덱스 값 > 종료 인덱스 값 이여도 작동한다!

<script>
    let txt = "My name is Hyeppy";

    console.log(txt.substring(0, 3)); // My 
    console.log(txt.substring(7, 3)); // name
    console.log(txt.substring(2)); // name is Hyeppy
</script>

 

3. substr(시작위치, 길이) : 시작인덱스부터 길이만큼 반환

* substr()은 명세에서 사라질 수 있기 때문에 slice, substring 사용을 권장한다고 한다!

<script>
    let txt = "My name is Hyeppy";

    console.log(txt.substr(3, 4)); // name
    console.log(txt.substr(txt.indexOf("n"), 4)); // name
</script>


4. replace(바꿀문자열, 바뀔문자열) : 문자열을 대체할 수 있다. 그러나 처음 나온 문자열 1개만 바꿀 수 있다.

 * 만약 모든 문자열을 대체하고 싶다면?

    1) /문자열/ => 정규표현식을 사용해 문자열을 슬래쉬로 감싸고, g(전역탐색,RegExp.prototype.global)을 사용한다.

       (정규 표현식 뒤의 "g"는 전체 문자열을 탐색해서 모든 일치를 반환하도록 지정하는 전역 탐색 플래그입니다.)

    2) repalceAll을 사용한다!

<script>
    let txt = "My name is Hyeppy Hyeppy";

    console.log(txt.replace("Hyeppy", "큐티")); // My name is 큐티 Hyeppy
    console.log(txt.replace(/"Hyeppy"/g, "큐티")); // My name is Hyeppy Hyeppy
    console.log(txt.replace(/Hyeppy/g, "큐티")); // My name is 큐티 큐티
    console.log(txt.replaceAll("Hyeppy", "큐티")); // My name is 큐티 큐티
</script>

5. includes(찾으려는 문자 or 문자열) : 문자 또는 문자열을 포함하고 있는지 확인할 수 있다.

* 찾는 문자열이 있다면 true, 없다면 false를 반환한다.

<script>
    let txt = "My name is Hyeppy Hyeppy";
     
    console.log(txt.includes("H")); // true
    console.log(txt.includes("Z")); // false
</script>

6. split(구분하려는 문자) : 문자열을 구분하려는 문자 기준으로 split 쪼개준다.

* split(" ") : 공백을 기준으로 문자열을 쪼개준다.

* split("-") : - 문자를 기준으로 문자열을 쪼개준다.

<script>
    let txt = "My name is Hyeppy Hyeppy";

    console.log(txt.split(" ")); // ['My', 'name', 'is', 'Hyeppy', 'Hyeppy']
    console.log("010-5044-2903".split("-")); // ['010', '5044', '2903']
</script>

7. trim() : 문자열 양 끝의 공백을 제거한다.

</script>        
    console.log("         abc"); //          abc
    console.log("         abc".trim()); // abc
    console.log("         a b c".trim()); // a b c
    console.log("         a b c              ".trim()); // a b c
</script>

 

출처 : https://always-hyeppy.tistory.com/27

Posted by useways
,