연말정산 시 환급금액을 늘리기 위해서는 세액공제를 잘 이용해야 합니다.

따라서 연말정산 세액공제 항목에 대해 정리해보겠습니다.

아래 그림처럼 연말정산시 최종적으로 계산되는 결정세액은 산출세액에서 세액공제를 제외한 금액으로 계산됩니다. 그러므로 세액공제 항목의 금액을 늘리는 만큼 내야 할 세금이 줄어들게 됩니다.

 -> 연말정산시 계산된 결정세액과 내가 1년간 낸 세금의 차이로 환급이냐 납세냐 결정됩니다.

연말정산 소득세 계산

 

그럼 챙겨야 할 세액공제 항목들에 대해서 알아보겠습니다.

자녀세액공제

자녀가 있는 경우에는 자녀 세액공제를 받을 수 있습니다. 만일 자녀가 7세 이상이라면 자녀 1명당 15만 원의 세액공제가 적용되며, 셋째부터는 1인당 30만 원씩 적용됩니다.

 

자녀 수에 따른 세액공제액

- 1명 : 15만 원

- 2명 : 30만 원

- 3명 : 60만 원

- 4명 : 90만 원

 

출산 또는 입양을 하신 경우에도 세액공제를 받을 수 있습니다.

당해에 출산 또는 입양한 자녀가 첫째면 30만 원, 둘째면 50만 원, 셋째부터는 70만 원의 세액공제가 적용됩니다.


연금계좌 납입금

연금계좌에 납입한 금액은 연간 400만 원 한도로 세액공제됩니다. 총급여에 따라 5500만 원 이하는 공제율 15%, 초과의 경우 공제율 12%가 적용됩니다. 


의료비와 교육비

의료비와 교육비는 각각 15%의 세액공제를 적용합니다. 본인의 치료나 교육을 위해 지출하면 전액 공제가 가능하며, 부양가족을 위해 소비한 경우는 한도가 정해져 있습니다. 부양가족에 대한 의료비 한도는 700만 원이며, 교육비는 미취학/초/중/고생 1인당 300만 원, 대학생은 900만 원이 한도입니다.

 

- 의료비 공제 시 부양가족이 만 65세 이상이거나 장애인, 건강보험산정특례자인 경우라면 한도 없이 전액이 공제됩니다.

- 진료나 병예방을 위해 의료기관에 지급한 비용, 치료 목적의 의약품(한약) 구입비, 안경/보청기 구입비 등도 공제 대상에 포함됩니다.

- 총 급여 7천만 원 이하의 근로자라면 산후조리원 비용도 출산 1회당 200만 원 이내에서 공제가 가능합니다.


기부금

기부금은 15%를 세액 공제하며, 1000만 원을 초과한 금액에는 30%를 적용합니다.


월세 

월세 세액공제는 총 급여 7000만 원 이하인 무주택자만 받을 수 있고, 주택 기준시가도 3억 원 이하여야 합니다. 공제 한도는 750만 원이며, 총 급여 5500만 원 이하는 12%의 세액공제율을 적용하고, 총 급여 5500만 원을 넘으면 월세액의 10%를 공제합니다.


표준공제

만일 소득공제와 세액공제를 아무것도 받을 게 없는 직장인이라면 표준공제를 신청할 수 있습니다. 보통 부양가족이 없거나 결혼을 하지 않은 1인 가구가 여기 해당됩니다. 표준공제는 일괄적으로 13만 원을 공제해주므로 만일 해당되는 경우 생각해보시길 바랍니다.


연말정산에 대해 기초부터 정리한 포스팅 중 일부입니다.

연말정산에 관심 있으시면 아래 포스팅도 참고해주세요~

 

2020/12/29 - [재테크/경제공부] - 연말정산 이란 무엇인가!

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 기본공제/인적공제

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 신용카드 공제

2020/12/29 - [재테크/경제공부] - 연말정산 세액공제 - 자녀세액공제, 특별세액공제 등(의료비, 교육비, 월세)


읽어주셔서 감사합니다. : )

좋은하루 보내세요~!

연말정산 계산 시 신용카드 사용금액은 소득공제 항목에 포함됩니다. 소득공제에는 인적공제, 주택자금공제, 신용카드공제 등을 포함하며 소득공제 항목금액이 커지는만큼 과제표준이 줄어들어 연말정산 환급액이 증가하게 됩니다. 이 포스팅에서는 소득공제 중 신용카드 소득공제에 대한 내용입니다.

연말정산 소득세  계산


신용카드 소득공제

연말정산시 근로자가 사용한 일부 소득에 대해서 공제해 주는 것을 소득공제라 하며, 이 중 신용카드, 직불카드, 선불카드 등에 대한 공제를 합쳐 '신용카드 소득공제'라 합니다. 보통 '신용카드 소득공제'라 하면 신용카드로만 사용한 금액 중 공제되는 것이라고 생각하시지만 넓은 의미에서는 모든 결제 수단을 포함한 소득공제라 생각하시면 됩니다.

 

'신용카드 소득공제' 계산시 사용한 모든 금액을 공제해주는 것이 아니라 총급여에 따른 한도액이 정해져 있으며, 결제한 수단이나 사용처별로 공제율이 상이합니다.

 

올해는 코로나19 영향으로 인해 월별로 공제율이 달라지게 되었고, 신용카드 소득공제 한도액 또한 상향되었습니다. 코로나19 이전에는 1~2월과 8~12월의 공제율이 적용되었습니다.


신용카드 소득공제 최소금액 및 제외항목

신용카드 공제를 받기 위해서는 총급여의 25% 이상을 카드로 사용해야 하며, 25% 이상분에 대해서만 공제율을 곱해 공제받을 수 있습니다. 1년 동안 신용카드, 체크카드, 선불카드 등으로 총급여의 25% 이상을 사용하지 못하였다면 받을 수 있는 신용카드 소득공제 항목은 0원입니다.

 

예를 들어, 연봉 4000만 원인 근로자가 1500만 원을 카드로 소비한 경우 총급여의 25%인 1000만 원이 최소금액이 됩니다.

 - 총 카드소비 1500만 원 - 최소금액 1000만원 = 500만원

이 나머지 500만 원에 대해서 공제율을 곱해 소득공제를 받습니다.

 

총급여의 25% 이상이 되는 금액을 신용카드 등으로 사용했는데도, 공제가 전혀 안될 수 있습니다.

카드 사용금액 중 공제 대상에서 제외되는 금액들이 있기 때문인데요. 각종 세금 및 공과금, 통신비, 상품권 구입비, 신차 구입비, 해외 사용금액 등은 소득공제 대상이 아닙니다.


신용카드 / 체크카드 사용전략

신용카드의 공제율이 제일 작으므로 결제일에 상관없이 최소금액을 채울 때는 신용카드로 사용한 금액부터 채워집니다.

 - 신용카드 공제율 : 15%, 체크카드 공제율 : 30%

 

연봉 4000만 원인 근로자가 1500만 원을 소비했는데 신용카드로 1000만원 체크카드로 500만원을 소비했다고 가정하면,

연봉의 25%인 최소금액 1000만 원을 채울 때 신용카드로 사용한 1000만 원이 채워집니다.

그리고 남은 체크카드 500만 원에서 체크카드 공제율 30%에 해당하는 150만 원이 공제됩니다. 

 

그렇다고 마냥 체크카드만 사용하는 것도 좋은 전략은 아닙니다. 왜냐하면 카드사에서 제공하는 각종 혜택이 신용카드가 훨씬 크기 때문이죠. 그러므로 전략적으로 사용비율을 가져가야 합니다.

 

소비가 급여의 25% 보다 적은 경우

어차피 최소금액을 채울 수 없어 신용카드 공제를 받을 수 없습니다. 그러므로 결제수단 중 가장 혜택이 좋은 신용카드로 결제하는 것이 좋습니다.

 

소비가 급여의 25% 를 초과하는 경우

이상적인 전략은 급여의 25% 까지만 각종 카드사 혜택을 누리며 신용카드로 소비하는 것입니다. 그리고 25%를 초과하는 소비는 공제율이 가장 높은 체크카드(선불카드, 현금 포함)를 이용하여 소비하는 것이 제일 좋습니다.

 

이 외에도 도서를 구매하거나 공연을 관람하는 등 문화생활 비용은 30%, 전통시장과 대중교통은 40%의 높은 공제율이 적용되니 적절히 이용하여 소득공제 금액을 높이는 것이 중요합니다. (신용/체크카드 한도와 별도입니다.)

 


연말정산에 대해 기초부터 정리한 포스팅 중 일부입니다.

연말정산에 관심 있으시면 아래 포스팅도 참고해주세요~

 

2020/12/29 - [재테크/경제공부] - 연말정산 이란 무엇인가!

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 기본공제/인적공제

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 신용카드 공제

2020/12/29 - [재테크/경제공부] - 연말정산 세액공제 - 자녀세액공제, 특별세액공제 등(의료비, 교육비, 월세)


읽어주셔서 감사합니다. : )

좋은하루 보내세요~!


연말정산의 기초에 이어서 연말정산 시 환급금액을 늘리기 위해 필수인 기본공제/인적공제 항목에 대해 살펴보겠습니다.

연말정산 계산시 기본공제/인적공제는 소득공제 항목에 포함됩니다. 기본공제와 인적공제를 받는 만큼 소득공제 항목이 커져 과제표준이 줄어드는 효과가 있습니다. 소득세는 누진세율이 적용되기 때문에 과제표준을 줄여 세율 구간을 바꿀 수 있다면 연말정산 환급액이 크게 증가하게 됩니다. 

연말정산 소득세 계산

근로자는 본인과 배우자 그리고 생계를 함께하는 부양가족에 대해 기본공제 및 추가공제(인적공제)를 받을 수 있습니다.

부양해야 할 가족이 많은 경우 생계유지비를 고려하여 나라에서 혜택을 주는 경우라 할 수 있습니다.


기본공제

근로자 본인, 배우자 및 생계를 같이하는 부양가족 1인당 연 150만원의 기본공제를 받을 수 있습니다. 다만 기본공제는 나이/소득/생계 각 요건을 모두 충족시키는 경우에만 근로자가 신청이 가능합니다.

부모님이나 배우자 등이 같이 살고 있더라도 소득이 기준금액을 초과한다면 기본공제를 받지 못하는 것에 주의합니다.

기본공제 나이/소득/생계 요건

추가공제(인적공제)

기본공제 대상자가 다음에 해당하는 경우는 기본공제 외에 추가로 공제를 받을 수 있습니다. 

- 장애인 공제 : 장애인인 경우 1명당 연 200만 원
- 경로우대자 공제 : 70세 이상인 경우 1명당 연 100만 원
- 부녀자 공제 : 
   1. 근로소득금액이 3천만 원 이하인 배우자가 있는 여성근로자인 경우 연 50만 원
   2. 근로소득금액이 3천만 원 이하인 배우자가 없고 기본공제대상 부양가족이 있는 여성 세대주의 경우 연 50만 원
- 한부모 공제 : 배우자가 없는 근로자가 기본공제대상 직계비속 또는 입양자를 부양하는 경우 연 100만 원
   (부녀자공제와 중복 배제: 한부모 공제를 우선 적용)

기본공제 및 인적공제 판단시점

위 공제 대상자에 해당하는지 여부의 판정은 해당 과세기간 종료일인 12월 31일 현재의 상황에 따릅니다. 단, 과세기간 종료일 전에 사망한 사람이나 장애가 치유된 사람에 한에서는 사망일 전날 또는 치유일 전날의 상황에 따릅니다.

 

1. 근로자가 12월25일에 결혼했다면 배우자에 대한 기본공제가 가능합니다.

 

2. 근로자가 80세의 직계존속을 부양하고 있다가 10월 20일에 사망한 경우에도 기본공제 150만 원에 경로우대자 추가공제 100만 원 모두 공제받을 수 있습니다.

 

3. 근로자의 자녀가 소득세법으로 인정되는 장애인이면서 소득이 없는 경우에는 나이에 관계없이 기본공제 및 추가공제를 받을 수 있습니다. 즉, 기본공제 150만 원 + 장애인 공제 200만 원으로 총 350만 원이 공제됩니다.

 

 


연말정산에 대해 기초부터 정리한 포스팅 중 일부입니다.

연말정산에 관심 있으시면 아래 포스팅도 참고해주세요~

 

2020/12/29 - [재테크/경제공부] - 연말정산 이란 무엇인가!

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 기본공제/인적공제

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 신용카드 공제

2020/12/29 - [재테크/경제공부] - 연말정산 세액공제 - 자녀세액공제, 특별세액공제 등(의료비, 교육비, 월세)


읽어주셔서 감사합니다. : )

좋은하루 보내세요~!


연말정산 시즌을 앞두고 연말정산의 기초와 공제받을 금액을 늘리기 위해 어떻게 해야 하는지 팁을 정리해보고자 합니다. 연말정산이 무엇인지 제대로 알고 대비해야 내지 않아도 될 세금을 피하고 오히려 환급을 받을수도 있겠죠.

 

이에 대한 첫 번째 포스팅으로 연말정산이란 무엇이고 어떻게 계산되는지에 대해 전체적으로 살펴보겠습니다.

연말정산

원천징수한 소득세와 그 해 납부했어야 할 실제 세액을 계산하여, 덜 납부한 금액은 추가로 징수하고 반대로 더 납부한 금액에 대해서는 환급해주는 제도입니다. 연금소득이나 사업소득에 대해서도 연말정산이 있으나 일반적으로 친숙한 것은 근로소득세액에 대한 연말정산입니다.

 

월마다 소득에 대한 정확한 세금을 계산하여 징수할 수도 있지만 개인 근로자나 과세관청의 부담이 증가할 것입니다. 연말정산을 매월마다 한다고 생각해보면 납세자 입장에서도 엄청 귀찮죠. 그래서 근로자를 고용하는 사업자들이 근로소득간이세액표에 따라 원천징수한 후 매년 2월 말 소득세를 계산하여 정산하는 제도가 연말정산입니다.

 

원천징수 : 납세의무자가 자신의 세금을 직접 납부하지 않고, 원천징수의무자(근로자의 소속회사)가 세법 규정에 따라 일정액을 징수하여 국가에 대신 납부하는 제도

내수경기 활성화 효과

연말정산시 각종 세액공제 제도가 있고, 원천징수 자체도 평균보다는 좀 더 징수하여 환급 시 공돈으로 인식되게 하는 측면이 있습니다. 아무래도 환급이 되면 이래저래 기분 내면서 소비를 더 하겠지요. 따지면 세금을 더 걷었다가 돌려주는 조삼모사이고, 되도록 세금을 늦게 내는 게 납세자한테는 이득이지만 세금폭탄이다 하면서 여론이 안 좋아지니 지금처럼 더 걷었다가 환급해주는 식으로 진행되고 있습니다.

 

나라에서는 의료비, 교육비, 월세 등 필수적으로 소비하는 비용이나 연금보험료나 기부금처럼 장려할 만한 지출은 추가 소득공제 또는 세액공제로 지정합니다. 연말정산시 환급을 받으려면 이러한 항목들을 챙기는 것이 좋습니다. 하지만 비용에 대해 전부 공제 해택을 주는 것이 아니라 일정 비율만이 공제가 되기 때문에 제도를 계속 주시해야 합니다.


면세근로자

월 소득액이 200만원이 안 되는 정도의 근로자인 경우 원천징수로 근로소득세를 내는 것처럼 보이지만 연말정산시 이미 냈던 근로소득세를 환급받아 실질적으로는 근로소득세 부담이 완전히 없는 것과 마찬가지가 됩니다. 즉, 추가적인 공제를 신경 쓰지 않더라도 전산에 잡힌 기본 공제만으로 이미 낼 세금이 없는 것으로 확정되어 원천징수당한 근로소득세 부분은 전부 환급받습니다. 이런 근로자들을 가리켜 국세청에서는 '면세근로자'라고 하며, 전체 근로자 중 약 40%가 해당된다고 추산하고 있습니다.


13월의 월급? 공돈?

연말정산시 환급받은 금액을 13월의 월급이나 공돈으로 표현합니다.

엄밀히 이야기 하면 미리 세금을 많이 내놓고 돌려받은 것이므로 공돈이 아니게 되죠. 오히려 원래 내 돈을 가져간 나라에 대해 기분을 나빠해야 됩니다. 그리고 소득공제나 세액공제를 받겠다고 소비를 늘리면 연말정산 환급이 소비만큼 되는 것이 아니므로 손해입니다. 고작 몇만원을 돌려받고자 몇십 몇백만 원을 소비하거나 먼 훗날 연금으로 받을 연금저축보험이나 연금펀드에 돈을 많이 넣는 것은 말이 되지 않습니다.

 

그러므로 연말정산을 위해 없어도 될 소비를 늘리는 것보다는 필수적으로 일어날 소비를 각종 공제를 많이 받을 수 있도록 현금, 신용카드, 체크카드로 분리하거나, 전통시장을 이용하는 등 전략적으로 해야합니다. 연말정산 시즌에 반짝 준비하는 것보다는 1년을 꾸준히 준비하는 것이 유리하겠죠.


연말정산 소득세 계산

  1. 연 근로소득-비과세소득=총급여액
  2. 총급여액-소득공제 = 과세표준
  3. 과세표준X세율 = 산출세액
  4. 산출세액-세액공제 = 결정세액
  5. 결정세액-기납부세액 = 추가납부세액 or 환급세액

각 항목마다 생략된 디테일한 부분이 있지만 전체적인 흐름을 보는 의미로 간단히 살펴보겠습니다.

 

1. 연 근로소득-비과세소득=총급여액

나라에서는 근로소득 전체에 대해 세금을 매기지 않습니다. '비과세소득'인 식비, 자차운전보조금 같은 비용은 제외되어 총급여액이 계산됩니다.

 

2. 총급여액-소득공제= 과세표준

총급여액에서 소득공제 항목을 제외하여 과제표준을 계산합니다.

소득공제 대표 항목에는 인적공제, 연금/건강/보험료 공제 등이 있습니다. 이 외에도 주택담보대출 이자, 전세자금대출 원금 및 이자에 대한 특별소득 공제 등도 있으며, 신용카드/체크카드/현금 사용 금액과 전통시장/대중교통 이용 금액의 일부를 소득공제받을 수 있습니다.

소득공제 각 항목의 한도 내에서 똑똑하게 소비하여 세액을 계산하는 실제 금액인 과세표준을 줄일 수 있습니다.

 

3. 과세표준X세율 = 산출세액

소득세는 누진세율을 적용합니다. 즉, 소득이 높아질수록 세율 자체가 올라가는 구조입니다. 소득의 구간별로 세율이 정해져 있으며 소득공제를 잘 받아 더 낮은 구간의 세율을 적용받는다면 환급금액이 많이 증가합니다. 과세표준에 누진세율이 적용된 세율을 곱하면 산출세액을 구할 수 있습니다.

 

4. 산출세액-세액공제 = 결정세액

산출세액에서 한번 더 세금을 줄일 기회인 세액공제가 있습니다. 세액공제는 소득공제처럼 소득을 줄이는 게 아닌 세금 자체를 깎습니다. 세액공제의 대표 항목에는 자녀 세액, 연금계좌 세액, 월세 세액 등이 있고 이 외에도 특별 세액 항목으로는 보장성 보험료, 의료비, 교육비, 기부금 등이 있습니다.

 

5. 결정세액-기납부세액 = 추가납부세액 or 환급세액

결정세액은 나라에서 실제 가져가야 할 세금입니다. 여기에 원천징수한 기납부세액을 빼면 추가 납부할 세액이 있는지 환급할 세액이 있는지 계산됩니다. 연말정산 시 최종 금액이 양수라면 결정세액이 더 많으므로 세금을 추가로 납부해야하며, 음수라면 기납부세액이 더 많으므로 환급받아야 합니다.

 


연말정산을 준비하는다는 것

일반 근로자의 경우 연말정산 간소화 서비스에 의해 본인의 소득 및 소비에 근거하여 최종 추가납부세액 또는 환급세액까지 한 번에 계산됩니다. 여기에 누락되어 추가해야 할 공제항목이 있으면 증빙 서류 등을 통해 반영되게 하는 작업 등을 통칭하여 연말정산이라고 합니다.

연말정산에서 중요 포인트는 두 가지 '소득공제'와 '세액공제'입니다. 이 공제를 받을 수 있는 소비내역이 있다면 꼼꼼히 증빙 내역을 챙겨야 합니다.

 

1년에 걸친 소비에 대해 정리하는 것이 연말정산이므로 한 해 동안 생각하고 똑똑하게 소비해야 합니다.


연말정산에 대해 기초부터 정리한 포스팅 중 일부입니다.

연말정산에 관심 있으시면 아래 포스팅도 참고해주세요~

 

2020/12/29 - [재테크/경제공부] - 연말정산 이란 무엇인가!

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 기본공제/인적공제

2020/12/29 - [재테크/경제공부] - 연말정산 소득공제 - 신용카드 공제

2020/12/29 - [재테크/경제공부] - 연말정산 세액공제 - 자녀세액공제, 특별세액공제 등(의료비, 교육비, 월세)

 


읽어주셔서 감사합니다. : )

좋은하루 보내세요~!

Optional의 등장 이유

자바로 프로그래밍을 하면서 NullPointerException을 안 겪어 본 사람은 없을 것이다. 그만큼 null은 오류를 자주 발생시킬 위험이 있으며 개발하는 입장에서도 상당 귀찮다.

 

null 때문에 발생할 수 있는 문제는 다음과 같다.

1. NullPointerException을 발생시킬 수 있다.

2. 반환된 객체를 처리할 때 if(obj == null){ } 등의 확인 코드가 증가한다. => 가독성이 낮아진다.

 

이러한 점을 해소하고자 등장한 java.util.Optional은 null이 반환되지 않게 하여 오류를 발생시키지 않고, 호출하는 쪽에서도 명시적으로 빈 값이 반환될 수 있음을 알게 하는 것이다.

Optional : 정상적인 결과물인 객체가 반환될 수도 있고, 아니면 빈 값이 반환될 수도 있다는 의미

 

Optional 객체 생성

1. 빈 Optional

Optional<Car> optCar = Optional.empty();

 

2. null이 아닌 객체로 Optional 만들기 : car가 null이라면 NullPointerException이 발생한다.

Optional<Car> otpCar = Optional.of(car);

 

3. null값으로 Optional 만들기 : car가 null이라면 빈 Optional 객체가 반환된다.

Optional<Car> otpCar = Optional.ofNullable(car);

 

Optional 실용 예제

메소드의 결과물로 Optional 반환

DB에서 데이터를 조회하거나 기타 로직으로 생성된 객체를 반환할 때 null이 반환되지 않게 하기 위해 Optional을 반환

// Object를 반환하지 않고 Optional로 한번 감싸서 반환한다.
//  >> Object객체는 빈값(null)이 될 수 있음을 알려준다.
public Optional<Object> getObject(String key){
    return Optional.ofNullable(map.get(key));
}

 

메소드를 호출하는 쪽에서도 if else로 분기하여 처리하지 않고 비즈니스 로직에 따라 처리

비어있는 Optional이 반환되면 Optional의 orEleseGet()으로 빈 객체를 생성하여 반환이 가능하다.

만일 빈 객체가 허용되지 않는다면 orElseThrow()로 오류를 쓰로우하고 종료할 수도 있다.

public Object run(){
    Optional<Object> optValue = getObject("key"); // 위의 getObject()를 호출

    // 1. 빈 객체를 생성하여 반환
    Object value = optValue.orElseGet(Object::new);
}
public Object run(){
    Optional<Object> optValue = getObject("key"); // 위의 getObject()를 호출

    // 2. 오류로 종료
    optValue.orElseThrow(() -> new NoSuchKeyException("해당 키의 값이 없습니다."));
}

 

 

컬렉션은 Optional로 감싸지 말고 빈 컬렉션을 반환

만일 컬렉션 데이터가 없다면 Optional으로 컬렉션을 감싸는 것보다는 빈 컬렉션을 반환하는 것이 효율적이다. (null은 반환하지 않는다.)

// 컬렉션에 데이터가 없으면 Optional로 감싸지 않는다.
List<Object> list = getList();
return Optional.ofNullable(list);

// 대신 빈 컬렉션을 반환한다.
List<Object> list = getList();
return list != null ? list : Collections.emptyList();

 

 

 

 

 


Camel case, Kebab case, Snake case 그리고 Pascal case

프로그래밍에서의 공백 제거

프로그래밍을 할 때 우리는 보통 단어 사이의 공백을 제거하고 위의 나열된 방식 중에 하나로 문자열을 표현합니다.

왜냐하면 공백(Space)은 프로그램에서 특별한 목적의 키워드로써 활용되기 때문이지요.

 

예를 들어 나의 방문자수를 나타내기 위해 변수명을 짓는다고 생각해보면,

My Visitor Count로 변수명을 짓고 싶지만 대부분은 int myVisitorCount 형식으로 변환하여 사용합니다.

 

여기서 My Visitor Count -> myVisitorCount 로 바꾸는 데 사용되는 규칙이 Camel Case이며 이 밖에도 여러 변환 규칙이 있습니다. 하나씩 살펴보겠습니다.

 

Camel Case(카멜 케이스)

낙타의 쌍봉과 같이 문자열의 첫 문자를 제외하고 단어의 첫 글자마다 대문자로 표현하는 방식입니다. 많은 프로그램 언어에서 컨벤션으로 사용됩니다.

 

변환 전 : My Visitor Count

변환 후 : myVisitorCount

 

Kebab Case(케밥 케이스)

생각하시는 그 먹는 케밥이 맞습니다. 카멜 케이스와 달리 모두 소문자로 표현하며 단어와 단어 사이를 대시(-)를 이용하여 구분합니다. 스프링의 yml파일이나 url주소에서 사용됩니다.

 

변환 전 : My Visitor Count

변환 후 : my-visitor-count

 

Snake Case(스네이크 케이스)

케밥의 대시(-)와 다르게 언더스코어(_)를 구분자로 합니다. 모든 문자를 대문자로 나타내는 방식도 사용되며 주로 상수 표현 시에 사용됩니다.

 

변환 전 : My Visitor Count

변환 후 : my_visitor_count

변환 후 : MY_VISITOR_COUNT

 

Pascal Case(파스킬 케이스)

카멜 케이스와 유사하지만 첫 문자도 대문자로 표현합니다.

 

변환 전 : My Visitor Count

변환 후 : MyVisitorCount

 

 

 


 


FileWriter에서 flush()와 close()의 차이점

FileWriter를 사용 후에는 flush()와 close()를 호출하는데요 두 메소드의 차이점에 대해 알아봅니다.

 

- flush() : FileWriter 내부 버퍼의 내용을 파일에 writer합니다. flush()를 호출하지 않는다면 내용이 버퍼에만 남고 파일에는 쓰이지 않는 상황이 나올 수 있습니다.

 

- close() : FileWriter는 스트림을 이용하여 파일의 내용을 읽어들입니다. 이때 close()를 호출하여 스트림을 닫으면 그 스트림을 다시 이용하여 파일에 쓰는 것이 불가능합니다.

파일은 파일시스템이나 기타 다른 곳에 있으므로 이 내용을 스트림으로 읽어 들이는데 메모리를 소모합니다. 작업이 끝나면 close()를 호출하여 스트림을 닫아 종료된 작업에 대해 메모리를 확보해야 합니다.


[Java] 파일 생성, 파일 읽기(File, FileReader. FileWriter)

이전에 자바에서 파일과 디렉터리를 추상화한 File 클래스에 대해 정리했었는데,

이번에는 생성한 파일에 내용을 작성하는 것에 대해 정리합니다.


1. 파일 생성 및 쓰기(FileWriter, BufferedWriter)

D:\MyWork 경로 하위에 Test.txt 파일을 생성하고 내용을 작성합니다.

FileWriter의 생성자는 두번째 인자로 boolean 타입을 받는데, 이는 파일에 내용을 이어붙혀서 작성할지 처음부터 덮어씌워서 작성할지 여부를 결정합니다. 디폴트는 덮어씌워 작성입니다. (기존 내용이 날아감)

BufferedWriter는 파일에 문자열을 쓰기위해 편리한 메소드를 제공합니다. 예를들면 newLine() 처럼 줄바꿈을 추가할 수 있죠.

public class FileWriterTest {
    public static void main(String[] args) throws IOException{
        String filePath = "D:/MyWork/Test.txt";

        File file = new File(filePath); // File객체 생성
        if(!file.exists()){ // 파일이 존재하지 않으면
            file.createNewFile(); // 신규생성
        }

        // BufferedWriter 생성
        BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));

        // 파일에 쓰기
        writer.write("하이루!");
        writer.newLine();
        writer.write("반가워!");
        writer.newLine();

        // 버퍼 및 스트림 뒷정리
        writer.flush(); // 버퍼의 남은 데이터를 모두 쓰기
        writer.close(); // 스트림 종료
    }
}
하이루!
반가워!

2. 파일 읽기(FileReader, BufferedReader)

1번에서 작성한 내용을 읽어 콘솔에 출력하는 예제입니다. 파일을 읽기위해 FileReader, 한줄 단위로 읽어오는 편리한 readLine() 메소드를 사용하기 위해 BufferedReader를 사용했습니다.

public class FileReaderTest {
    public static void main(String[] args) throws IOException{
        String filePath = "D:/MyWork/Test.txt";

        File file = new File(filePath); // File객체 생성
        if(file.exists()){ // 파일이 존재하면
            BufferedReader reader = new BufferedReader(new FileReader(file));

            System.out.println("파일내용 출력------------------");
            String line = null;
            while ((line = reader.readLine()) != null){
                System.out.println(line);
            }
            System.out.println("------------------------------");

            reader.close();
        }
    }
}

 

 


 

 

 

 

 

 

StringTokenizer 기본 및 사용법

StringTokenizer 클래스는 문자열을 구분자를 이용하여 쪼갤 때 사용할 수 있다. (쪼갠다. = 파싱한다.)

예를 들어 "Hi I'm Yangs!!" 라는 문자열을 " "(공백)을 구분자로 "HI", "I'm", "Yangs!!" 이렇게 3개로 쪼개는 것이 가능하다.

Token을 구분자에 의해 쪼개진 단어라고 생각하면 된다.

 

StringTokenizer 생성

- StringTokenizer(String str) : 파싱 할 문자열을 인자로 받는다. 구분자를 지정하지 않았으므로 스페이스, 탭, 줄바꿈, 캐리지 리턴 등 기본 구분자가 적용된다.

- StringTokenizer(String str, String delim) : 파싱할 문자열과 구분자를 인자로 받는다.

- StringTokenizer(String str, String delim, boolean flag) : flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 정한다. 예를 들어 true라면 "Hi I'm Yangs!!"는 공백을 포함하여"HI", " ", "I'm", " ", "Yangs!!" 이렇게 5개의 토큰으로 파싱 된다.

String source = "Hi I'm Yangs!!";

StringTokenizer tokenizer1 = new StringTokenizer(source);
while(tokenizer1.hasMoreTokens()){
    System.out.println("tokenizer1's token : " + tokenizer1.nextToken());
}

StringTokenizer tokenizer2 = new StringTokenizer(source, " ");
while(tokenizer2.hasMoreTokens()){
    System.out.println("tokenizer2's token : " + tokenizer2.nextToken());
}

StringTokenizer tokenizer3 = new StringTokenizer(source, " ", true);
while(tokenizer3.hasMoreTokens()){
    System.out.println("tokenizer3's token : " + tokenizer3.nextToken());
}
// 출력결과
tokenizer1's token : Hi
tokenizer1's token : I'm
tokenizer1's token : Yangs!!

tokenizer2's token : Hi
tokenizer2's token : I'm
tokenizer2's token : Yangs!!

tokenizer3's token : Hi
tokenizer3's token :  
tokenizer3's token : I'm
tokenizer3's token :  
tokenizer3's token : Yangs!!

StringTokenizer 사용법

StringTokenizer를 이용하여 문자열 -> 배열로 파싱하기

가장 많이 사용되는 문자열을 파싱하여 배열에 담는 예제이다.

hasMoreTokens()로 총토큰의 개수를 구하고, nextToken()으로 한 토큰씩 꺼낼 수 있다.

StringTokenizer는 구분자에 의해서 파싱 후 빈 토큰은 버리는 동작을 확인할 수 있다.

String source = "|문자열||에서|배열로|갑니다|";

// StringTokenizer 생성
StringTokenizer tokenizer = new StringTokenizer(source, "|");
System.out.println("총 토큰 갯수 : " + tokenizer.countTokens()); // 총 토큰 갯수 : 4

String[] arr = new String[4]; // 결과 배열
int idx = 0;
while (tokenizer.hasMoreTokens()){
    arr[idx] = tokenizer.nextToken(); // 배열에 한 토큰씩 담기
    idx++;
}

System.out.println(Arrays.toString(arr)); // [문자열, 에서, 배열로, 갑니다]

 

 

여러 구분자로 파싱하기

StringTokenizer 생성자 구분자를 여러 개 지정하면 된다. > new StringTokenizer(source, ",|;!")

String source = "|문자열,,에서|배열로;갑니다!";

StringTokenizer tokenizer = new StringTokenizer(source, ",|;!");
System.out.println("총 토큰 갯수 : " + tokenizer.countTokens()); // 총 토큰 갯수 : 4

String[] arr = new String[4];
int idx = 0;
while (tokenizer.hasMoreTokens()){
    arr[idx] = tokenizer.nextToken();
    idx++;
}

System.out.println(Arrays.toString(arr)); // [문자열, 에서, 배열로, 갑니다]

 

 


 

 

[Java] File 클래스 기본

Java.io.File 클래스는 자바에서 파일시스템의 파일이나 디렉터리(폴더)를 추상화 한 클래스이다.

즉, File 클래스를 통하여 파일시스템의 파일이나 디렉터리를 조작(삭제, 파일명변경 등)을 할 수 있다.

 

File 클래스를 통해 할 수 있는 작업이 많은 만큼 제공되는 메소드들도 다양하다. File 클래스의 생성과 케이스별 사용법에 대해 정리한다.

 


File 객체 생성

아래 경로처럼 Test.txt 파일을 생성하고 이 파일의 File 객체를 생성한다.

D:\MyWork\Test.txt

public class File_Practice {
    public static void main(String[] args) {
        String parentPath = "D:/MyWork";
        String filePath = "D:/MyWork/Test.txt";
        String fileNm = "Test.txt";

        // File(File parent, String child) 생성자
        File file1 = new File(parentPath, fileNm);

        // File(String pathname) 생성자
        File file2 = new File(filePath);

        // File(String parent, String child) 생성자
        File parent = new File(parentPath);
        File file3 = new File(parent, fileNm);

        if(file1.exists() && file2.exists() && file3.exists()){
            System.out.println("모두 생성 완료!");
        }
    }
}

file.exist() 는 파일의 존재여부를 검사하는 메소드를 이처럼 File 클래스에서는 파일에 관한 여러 편리한 메소드를 제공하도 있다.

아래부터는 이런 메소드들을 활용하여 어떤 작업을 할 수 있는지 케이스별로 살펴본다.


File 객체 활용

아래 소스코드를 실행하기 위한 디폴트 폴더/파일 구성은 아래와 같습니다.

D:/MyWork (Dir)
D:/MyWork/Test.txt (File)
D:/MyWork/MyDirectory (Dir)

1. 파일 또는 디렉터리의 존재유무 확인 및 기본정보 출력

public class Check_Default_Info {
    public static void main(String[] args) {
        String rootPath = "D:/MyWork";

        File rootDir = new File(rootPath);

        // 파일명
        System.out.println(rootDir.getName()); // MyWork

        // 절대경로
        System.out.println(rootDir.getAbsolutePath()); // D:\MyWork

        // 경로
        System.out.println(rootDir.getPath()); // D:\MyWork

        // 존재여부
        System.out.println(rootDir.exists()); // true

        // 읽기/쓰기/실행 가능여부
        if (rootDir.exists()) { // 존재하면
            System.out.println(rootDir.canRead()); // true
            System.out.println(rootDir.canWrite()); // true
            System.out.println(rootDir.canExecute()); // true
        }
    }
}

 


2. 디렉터리의 내부 내용물(파일, 디렉터리) 출력

디렉터리의 경우 listFiles() 메소드로 내부 파일(디렉터리 포함) 목록을 가져올 수 있으며 for문으로 순회하며 작업을 할 수 있다.

public class Check_DirectoryContents_Info {
    public static void main(String[] args) {
        String rootPath = "D:/MyWork";
        File rootDir = new File(rootPath);

        if(rootDir.isDirectory()){ // 디렉터리면
            File[] contents = rootDir.listFiles(); // 파일목록을 가져온다.
            for(File file : contents){
                System.out.println("파일명 : " + file.getName());
                System.out.println("절대경로 : " + file.getAbsolutePath());
                System.out.println("파일여부 : " + file.isFile());
                System.out.println("------------------------------");
            }
        }
    }
}
// 출력결과
파일명 : MyDirectory
절대경로 : D:\MyWork\MyDirectory
파일여부 : false
------------------------------
파일명 : Test.txt
절대경로 : D:\MyWork\Test.txt
파일여부 : true
------------------------------

3. 디렉터리 및 파일 생성

mkdir() 메소드를 사용하여 디렉터리를 생성한다. mkdirs() 메소드도 제공되며 차이점은 mkdirs()는 필요한 상위의 디렉터리가 없으면 같이 만든다는 것에 있다.

createNewFile() 메소드는 신규 파일을 생성할 수 있다. 

length() 메소드는 파일의 용량을 체크할 수 있으며 신규 파일의 경우 빈 파일이므로 0이 출력된다.

public class Mkdir {
    public static void main(String[] args) {
        String rootPath = "D:/MyWork";
        File rootDir = new File(rootPath);

        // 디렉터리 생성시작
        File newDir = new File(rootDir, "newDir"); // 생성할 디렉터리
        System.out.println("신규 디렉터리 생성여부 : " + newDir.exists()); // false

        boolean isMake = newDir.mkdir(); // 디렉터리 생성
        System.out.println("신규 디렉터리 생성결과 : " + isMake); // true
        System.out.println("신규 디렉터리 생성여부1 : " + newDir.exists()); // true
        System.out.println("신규 디렉터리 생성여부2 : " + newDir.isDirectory()); // true

        // 파일 생성시작
        File newFile = new File(newDir, "newFile");
        System.out.println("신규 파일 생성여부 : " + newFile.exists()); // false

        try {
            newFile.createNewFile(); // 파일생성
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("신규 파일 생성여부 : " + newFile.exists()); // true
        System.out.println("신규 파일 용량 : " + newFile.length()); // 0
        System.out.println("신규 파일 경로 : " + newFile.getAbsolutePath()); // D:\MyWork\newDir\newFile
    }
}

 


4. 파일명 변경 및 삭제

createNewFile()로 새로운 파일 생성 후 delete() 메소드로 삭제한다.

public class Rename_Delete {
    public static void main(String[] args) throws IOException {
        String rootPath = "D:/MyWork";
        File rootDir = new File(rootPath);

        File file = new File(rootDir, "tmpFile");
        file.createNewFile();
        System.out.println("삭제전 파일 존재여부 : " + file.exists()); // true

        // 파일삭제 시작
        boolean isDel = file.delete();
        System.out.println("파일 삭제 여부 : " + isDel); // true
        System.out.println("삭제후 파일 존재여부 : " + file.exists()); // false
    }
}

 


 

+ Recent posts