프로그램에서 가장 기본적인 단위가 함수다.

함수를 잘 만드는 방법을 알아보자

작게 만들어라

작게 더 작게!

책의 저자는 근거를 대기는 어렵지만 40년간 경험과 시행착오를 바탕으로 작은 함수가 좋다고 주장한다.

 

블록과 들여 쓰기

함축적으로 말하면 제어문이나 반복문 등에 들어가는 블록 속 코드는 한 줄이여야 한다는 의미다.

따라서 그 안에서 함수를 호출하게 된다. 그리고 그 함수 이름을 잘 짓는다면 코드를 이해하기도 쉬워진다.

public class Ex01 {
	public static void main(String[] args) {
		int number = 31;
		
		if(isEvenNumber(number) ) {
			reportEvenNumber();
		} else {
			reportOldNumber();
		}
		
	}

	private static void reportOldNumber() {
		System.out.println("홀수에요!!");
	}

	private static void reportEvenNumber() {
		System.out.println("짝수에요!!");
	}
	private static boolean isEvenNumber(int number) {
		return number%2 == 0 ? true : false;
	}
}

블록과 들여 쓰기는 1단이나 2단을 넘어서면 안 된다. 중첩 구조가 생길만큼 커지면 안된다.

 

 

함수 당 추상화 수준은 하나로

함수내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다.

특정 표현이 근본 개념인지 세부사항인지 구분하기 어렵고 섞이기 시작하면 깨진 창문 효과 처럼 사람들이 함수에 세부사항을 점점 추가한다.

 

 

위에서 아래로 코드 읽기: 내려가기 규칙

코드는 위에서 아래로 잘 쓴 글처럼 읽혀야 된다.

위에 함수는 추상화 수준이 높다.

아래 함수는 추상화 수준이 낮다.

위에서 아래로 갈수록 추상화 수준이 한 단계 씩 낮아진다.

 

 

Switch 문은 작게 만들기 어렵다. ( if/else 포함)

public Money calculatePay(Employee e) throws InvalidEmployeeType {
	switch (e.type){
		case COMMISSIONED:
			return calculateCommissionedPay(e);
		case HOURLY:
			return calculateHourlyPay(e);
		case SALARIED:
			return calculateSalariedPay(e);
		default:
			throw new InvalidEmployeeType(e.type);
	}
}

위 함수의 문제점

  1. 함수가 길다. 새 직원 유형 추가 시 더 길어진다
  2. 함수는 한 가지 작업을 잘해야 한다. 위 함수는 한 작업만 수행하지 않는다.
  3. SRP(Single Responsibility Principle) 위반한다. 코드를 변경할 이유가 여럿이다.
  4. OCP(Open Closed Principle) 위반한다. 새 직원 유형 추가 때마다 코드를 변경한다.
public abstract class Employee {
	public abstract boolean isPayday();
	public abstract Money calculatePay();
	public abstract void deliverPay(Money pay);

}
 #########################
interface EmployeeFactory {
	public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
#########################
public class EmployeeFactoryImpl implements EmployeeFactory {

	@Override
	public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
		switch (r.type) {
		case COMMISSIONED:
			return new CommissionedEmployee(r);
		case HOURLY:
			return new HourlyEmployee(r);
		case SALARIED:
			return new SalariedEmployee(r);
		default:
			throw new InvalidEmployeeType(r.type);
		}
	}
}

switch문을 추상 팩토리에 숨겼다. 팩토리에서 적절한 Employee 구현체 인스턴스를 반환한다. 

반환된 객체는 다형성을 통해 서로 다른 동작을 하게 된다.

 

 

'IT책, 강의 > 클린코드(Clean Code)' 카테고리의 다른 글

4장 주석 - 나쁜 주석  (1) 2022.10.01
4장 주석 - 좋은 주석  (0) 2022.09.28
3장 함수 - 2  (2) 2022.09.25
2장 의미 있는 이름  (0) 2022.07.01
1장 깨끗한 코드  (0) 2022.06.27

하나의 타입, 하나의 값을 저장할 수 있는 메모리 공간

 

int var = 0;

int는 변수의 타입, var는 변수 메모리 공간의 이름

자바는 강타입 언어로 타입을 명확히 한다.

 

변수의 초기화

메모리는 자바 프로그램 뿐만아니라 모든 프로그램이 공유하는 h/w자원이다.

따라서 그 공간에 잔여 값이 남아 있을 수도 있다. 

 

변수 초기화란 변수 사용 전에 처음으로 값을 저장하는 것을 말한다.

	public class Var {
	      static int classVariable;
	      int instanceVariable;
	      
	      //main()도 메서드이므로 로컬영역이다.
	      public static void main(String[] args) {
	            VarEx1 instance = new VarEx1();
	            int localVariable;
	            System.out.println(classVariable);
	            System.out.println(instance.instanceVariable);
	//          System.out.println(localVariable);
	      }
}

기본형 인스턴스 변수와 클래스 변수는 각각 정해진 기본값으로 초기화가 자동으로 된다.

기본형 지역변수는 선언과 동시에 초기화를 반드시 해야한다.

 

 

두 변수의 값 교환하기

현실의 사고방식으로는 바꿔치지를 생각할 있지만 여기는 기계속이다. 불가능하다.

  1. 먼저 a temp 임시 저장한다
  2. a 자리에 b 값을 넣는다.
  3. b 자리에 temp 값을 넣는다.

물컵 잔에 내용물을 바꾼다고 생각하면 쉽다.

아니면 실제로 코드상으로 변수 2개로만 바꿀려고 시도해보자. 그러면 왜 temp가 필요한지 이해가 잘된다.

 

변수명 규칙

  • 대소문자 구분한다/ 길이제한 없다
  • 예약어를 사용하면 안된다
  • 숫자로 시작하면 안된다
  • 특수문자는 _ , $ 허용한다

예약어는 대부분 자바 문법상 사용하는 단어들이다. 따라서 외울 생각을 할필요가 없다

int, long, for, ....

다만 예약어가 포함되어 있다고 사용이 다 불가능하지 않다. intSum 이런 것은 된다. 

즉, 딱 그 예약어 단어 사용이 불가능하다.

추가 권장사항

  • 클래스 이름은 글자를 대문자로한다
  • 여러 단어 이름은 단어 글자를 대문자로 한다
  • 상수의 이름은 대문자로만 사용하며 단어 구분은 _ 한다

 

 

'개발 > 자바(JAVA)' 카테고리의 다른 글

파일 옮기기  (0) 2022.07.25
변수의 타입  (0) 2022.07.07
자바란?  (0) 2022.07.02
폴더, 파일 수 탐색  (0) 2022.05.27
File  (0) 2022.05.26

1996년 출시한 객체지향 프로그래밍 언어

 

자바의 특징

  • 운영체제에 독립적이다.
    JVM만 설치되면 된다. JVM은 거의 모든 운영체제별로 준비가 되어있다.
    따라서 하나의 코드로 모든 환경에서 사용이 가능하다.

  • 객체지향언어이다.
    코드의 재사용성, 유지보수가 편리하다
  • 자동 메모리 관리
    메모리를 관리해주는 가비지 컬렉터가 존재해 개발자는 메모리 관리에 힘을 쓰지 않고 개발에만 집중할 수 있다.
  • 네트워크와 분산처리를 지원한다.
  • 멀티쓰레드를 지원한다.
    멀티쓰레드는 운영체제에 따라 구현 방법도 상이하고, 처리방법도 다르지만 자바는 멀티쓰레드 관련 API를 제공한다.
    따라서 사용법만 알면 손쉽게 구현이 가능하다
  • 동적로딩을 지원한다.
    애플리케이션 실행 시 모든 클래스가 로딩되지 않고 필요한 시점에 로딩할 수 있다.

JVM(Java Virtual Machine)

모든 자바 코드를 실행하기 위한 프로그램

자바와 일반 소프트웨어 차이

  • 단점
    일반 애플리케이션은 OS 거치고 컴퓨터로 코드 전달따라서 속도가 느리다.
    하지만 극복을 위해 요즘엔 바이트코드(컴파일된 자바코드) 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도 격차를 많이 줄였다.
  • 장점
    하나의 코드로 모든 플랫폼에서 실행이 가능하다.

'개발 > 자바(JAVA)' 카테고리의 다른 글

파일 옮기기  (0) 2022.07.25
변수의 타입  (0) 2022.07.07
변수  (0) 2022.07.03
폴더, 파일 수 탐색  (0) 2022.05.27
File  (0) 2022.05.26

사소해 보이지만 가장 쉽고  중요하다.

이름은 변수, 함수, 인수, 클래스, 패키지, 소스파일, jar, war... 어디에나 붙는다.

 

요즘은 IDE발전으로 일괄 이름 바꾸기가 편하다. 따라서 크게 고민하지 말고 주저 없이 이름을 붙여라

 

의도를 분명히 밝혀라

좋은 이름을 지으려면 시간이 걸리지만 그보다 좋은 이름으로 절약하는 시간이 더 크다.

의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.

 

그릇된 정보를 피하라

헛갈릴만한 약어 사용을 피하라. 독자에게 그릇된 정보를 제공한다.

서로 흡사한 이름을 사용하지 않도록 주의하자.

유사한 개념은 유사한 표기법을 사용하자.

 

 

의미있게 구분하라

불용어 사용을 피하자. 아무런 정보를 주지 못한다.

내가 만약 계좌 정보 알려주는 메서드를 찾는다. 한 클래스에 다음과 같이 메서드가 존재한다. 도대체 무엇을 호출해야 하는가?

getActiveAcount();
getActiveAccounts();
getActiveAccountInfo();

누가 봐도 의미를 파악할 수 있게 구분하자.

 

 

 

발음하기 쉬운 이름을 사용하라

발음이 어려운 이름을 사용하면 상호 커뮤니케이션이 어려워진다.

int zkaq ; // 엑스케이이이큐에 값을 저장하면되요!
int sum ;  // 썸에 값을 저장하면 되요!

 

검색하기 쉬운 이름을 사용하라

문자를 하나만 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다

내가 상수로 지정한 MAX_CLASSES_PER_STUDENT 찾기 쉬울까?

해당 상수의 값인 7 찾는 것이 찾기 쉬울까?

특히 한자리 변수는 찾기 어렵다. 이런 관점에서 이름이 짧은 이름보다 좋다. 검색하기 쉬운 이름이 상수보다 좋다.

 

 

인코딩을 피하라

과거 코딩할 때나 필요했던 정보

자바는 강타입 언어라 필요 없다.

 

자신의 기억력을 자랑하지 마라

문자 하나만 사용하는 변수 이름은 문제가 있다. 간단한 for 문에서 사용하는 i,j..등은 괜찮지만 나머지 상황에서는 누가봐도 명확하게 이름을 지어야 한다.

전문가 프로그래머는 자신의 코드를 남들이 최대한 이해하기 쉽게 한다.

 

 

클래스 이름

클래스 이름은 일반적으로 명사나 명사구를 사용하고, 동사는 피한다

Manager,Processor,Data,Info 등과 같은 모호한 단어는 피한다.

 

메서드 이름

메서드 이름은 동사나 동사구를 사용하자

접근자, 변경자, 조건자는 자바빈 규약에 따라 set, get, is 붙이자.

 

 

기발한 이름은 피하라

재미난 이름보다 명료한 이름을 선택하라

의도를 분명하고 솔직하게 표현하라

 

 

한 개념에 한 단어를 사용하라

추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.

예를 들어, 똑같은 기능 메서드를 클래스마다 get, fetch, retrieve로 제각각 부르면 혼란스럽다.

메서드 이름은 독자적이고 일관적이어야 한다. 그래야 주석을 뒤져보지 않고도 프로그래머가 올바른 메서드를 선택한다.

 

 

말장난을 하지마라

단어를 가지 목적으로 사용하지 마라. 다른 개념에 같은 단어를 사용하는 것은 말장난에 불과하다.

 

add 더하기로 사용했는데 다른 클래스나 메서드에서 집합에서 추가의 뜻으로 add 사용하면 옳은 것인가? 이럴때는 insert, append 사용하라

 

프로그래머는 코드를 최대한 이해하기 쉽게 짜야 한다. 주의깊게 봐야 이해가능한 코드가 아니라 대충 훑어봐도 이해할 코드 작성이 목표다.

 

 

해법 영역에서 가져온 이름을 사용하라

코드를 읽을 사람도 프로그래머라는 사실을 명심하자. 그러므로 전산용어, 알고리즘 이름, 패턴 이름 등을 사용해도 괜찮다.

예를 들어, Factory 패턴을 사용했다면 CustomFactory 이런식

 

 

문제 영역에서 가져온 이름을 사용하라

적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.

 

의미 있는 맥락을 추가하라

클래스, 함수, 이름 공간에 맥락을 부여하자.

street, city ,state, zipcode 라는 변수가 있을때

훑어보면 맥락상으로 주소라는 것을 있다.

허나 단순히 하나의 변수만 사용할때 state 사용한다고 이게 주소인지 확실히 있을까?

이럴때 접두사를 붙인다 addrStreet, addrCity, addrState, addrZipcode

좋은 방법은 클래스로 묶는 것이다. Address 클래스를 만들고 멤버로 추가하자

 

 

불필요한 맥락을 없애라

의미가 분명한 경우에 한해서 짧은 이름이 이름보다 좋다. 이름에 불필요한 맥락을 추가하지 않도록 주의하자.

 

마치면서

좋은 이름을 선택하려면 설명 능력이 뛰어나야한다. 이는 문화적 배경이 같아야한다

대부분 사람은 자신이 클래스, 메서드 이름을 모두 암기하지 못한다.

이부분은 개발도구에 맡기고 개발자는 자료 구조처럼 읽히는 코드를 짜는데 집중해야한다.

이름을 자신 나름대로 바꿨다고 질책받았다고 해서 포기하면 안된다.

요즘은 IDE에서 쉽게 이름을 일괄로 바꿀 있기 때문에 좋은 이름이 생각나면 주저 없이 바꾸

'IT책, 강의 > 클린코드(Clean Code)' 카테고리의 다른 글

4장 주석 - 나쁜 주석  (1) 2022.10.01
4장 주석 - 좋은 주석  (0) 2022.09.28
3장 함수 - 2  (2) 2022.09.25
3장 함수 - 1  (0) 2022.07.05
1장 깨끗한 코드  (0) 2022.06.27

스패로우 같은 취약점 점검 툴을 점검 결과로 

제가 있는 사이트에 기존 sql mapper 파일에서 500개 정도되는 Mybatis Sql Injection 취약점이 나왔습니다.

원인은 ${} 사용 때문입니다. 

${}를 전부 #{}로 바꿔줬습니다.

SELECT '${BIND1}' FROM TEST
WHERE ${BIND2} BETWEEN '${BIND3}' AND '${BIND4}'

저같은 경우는 notepad++ 로 수정했습니다. 

이클립스나 STS도 당연히 정규식을 지원합니다.

 

\$\{[^{}]*\}  

 

일반적으로 ${}  안쓰는 것이 좋습니다.

성능면에서도 #{} 가 더 좋습니다. DB에 Library Cache를 찾아서 실행하기 때문입니다.

SELECT #{BIND1} 
FROM DUAL

실제 DB질의는 "SELECT ? FROM DUAL" 로 나가고 

파라미터로 #{BIND1} 값이 나갑니다. 

 

코드가 존재하리라

코드는 요구사항을 상세히 표현하는 수단이다.

어느 정도 수준에 이르면 코드의 도움 업싱 요구사항을 상세하게 표현하기란 불가능하다.

궁극적으로 코드는 요구사항을 표현하는 언어라는 사실을 명심한다.

 

 

나쁜 코드

우리는 나쁜 코드를 본적도 짠 적도 있을 것이다.

우리 모두는 자신이 쓰레기 코드를 나중에 손보겠다고 생각한 경험이 있다. 하지만 나중은 결코 오지 않는다.

 

 

나쁜 코드로 치르는 대가

프로젝트 초반에 코드에 시간은 안쓰고 대충 짠 나쁜 코드를 빠르게 치고 나가는 경우가 있다.

하지만 조금만 지나면 뮨재가 생긴다. 코드를 고칠 때 마다 엉뚱한 곳에 문제가 생기고 코드 변경이 어려워진다.

결국 나쁜 코드가 쌓여 생산성이 저하된다.

 

 

원대한 재설계의 꿈

기존 코드가 엉망이라 생산성이 안나와 관리층에서 재설계를 허용해 줘도 결국 재설계 또한 쉽지 않다.

이유는 재설계 시스템이 기존 시스템 기능을 100% 지원해야 하면서, 재설계 도중 기존 시스템에 가한 변경도 따라잡아야 하기 때문이다. 

결과적으로 처음부터 시간을 들여 깨끗한 코드를 만드는 노력이 비용을 절감하는 방법이다.

 

태도

코드가 왜 이렇게 엉망이 되었나?

온갖 이유(변명) 들어댄다.

하지만 잘못은 전적으로 우리 프로그래머에게 있다. 우리가 전문가 답지 못했기 때문이다.

 

고객이 일정과 요구사항을 강력하게 밀어붙이는 이유는 그것이 그들의 책임이기 때문이다. 역으로 좋은 코드를 사수하는 일은 바로 우리 프로그래머들의 책임이다.

 

예를 들어, 자신이 의사라 가정하자. 어느 환자가 수술 전에 손을 씻지 말라고 요구한다.

시간이 너무걸리니까! 하지만 의사는 단호하게 거부한다. ? 질병과 감염의 위험은 환자보다 의사가 아니까. 환자 말을 그대로 따르는 행동은 범죄일 뿐만 아니라 전문가 답지 못하니까.

 

프로그래머도 마찬가지다. 나쁜 코드의 위험을 이해하지 못하는 관리자 말을 그대로 따르는 행동은 전문가답지 못하다.

 

 

 

원초적 난제

나쁜 코드는 결국 업무 속도를 늦춘다는 사실을 우리는 안다

그럼에도 불구하고 모든 프로그래머가 기한을 맞추려면 나쁜 코드를 양산할 수밖에 없다고 느낀다. 빨리 가려고 코드에 시간을 들이지 않는다.

부분이 틀렸다는 것을 명심하라

오히려 엉망진창인 상태로 인해 속도가 곧바로 늦어지고, 결국 기한을 놓친다.

빨리 가는 유일한 방법은, 언제나 코드를 최대한 깨끗하게 유지하는 습관이다.

 

 

 

깨끗한 코드라는 예술?

꺠끗한 코드를 구현하는 행위는 그림 그리기와 비슷하다.

그림을 보면 대부분 사람들이 잘그렸다 못그렸다 판단을 있지만,

그것이 그림을 잘그리는 능력이 아니다.

다시말해, 깨끗한 코드와 나쁜 코드를 구분할 안다고 깨끗한 코드를 작성할 안다는 뜻은 아니다.

 

 

깨끗한 코드란?

이 질문에 대한 대가들의 답변 요약

비야네 스트롭스트룹

나쁜 코드는 더욱 나쁜 코드가 되도록 유혹한다. 나쁜 코드를 개선하려다 나쁜 코드를 양산할 있다.

깨끗한 코드는 한가지에 집중한다.

 

그래디 부치

깨끗한 코드는 짤 쓴 문장처럼 읽혀야 한다.

 

큰 데이브 토마스

깨끗한 코드란 다른 사람이 고치기 쉬워야 한다.

읽기 쉬운 코드와 고치기 쉬운 코드는 엄연히 다르다.

테스트 케이스가 없는 코드는 깨끗한 코드가 아니다.

 

마이클 페더스

깨끗한 코드는 주의 깊게 작성한 코드다.

 

 

론 제프리스

중요도 순 나열

  • 모든 테스트를 통과한다
  • 중복이 없다
  • 시스템 내 모든 설계 아이디어를 표현한다
  • 클래스, 메서드, 함수 등을 최대한 줄인다

 

워드 커닝햄

읽으면서 짐작한 대로 돌아가는 코드가 깨끗한 코드다.

 

 

 

 

우리들의 생각

깨끗한 변수 이름, 깨끗한 함수, 깨끗한 클래스를 만드는 방법을 소개한다.

이책은 나와 동료들이 속한 오브젝트 멘토 진영이 생각하는 깨끗한 코드를 설명한다.

여기서 가르치는 교훈과 기법외에 다른 집단이 가르치는 것이 틀렸다는 것이 아니다!

다만 우리 진영이 가르치는 교훈과 기법은 수십 년에 걸친 경험과 반복적인 시행착오로 습득한 것이다.

 

 

우리는 저자다.

코드를 읽는 시간 코드를 짜는 시간 비율이 10 1 훌쩍 넘는다.

코드를 짜면서 우리는 끊임없이 기존 코드를 읽는다.

다시말하면 읽기 쉬운 코드가 매우 중요하다는 것이다. 비록 읽기 쉬운 코드를 짜기 쉽지 않더라도 말이다.

주변 코드가 읽기 쉬우면 새코드를 짜기도 쉽다.

주변 코드가 읽기 어려우면 새코드를 짜기 어렵다.

 

 

결론

예술에 대한 책을 읽는다고 예술가가 된다는 보장은 없다.

책을 읽는다고 뛰어난 프로그래머가 된다는 보장은 없다. 코드감각을 확실히 얻는 다는 보당도 없다.

단지, 뛰어난 프로그래머가 생각하는 방식과 그들이 사용하는 기술과 기교와 도구를 소개할 뿐이다.

나머지는 책을 읽는 독자에게 달렸다.

 

'IT책, 강의 > 클린코드(Clean Code)' 카테고리의 다른 글

4장 주석 - 나쁜 주석  (1) 2022.10.01
4장 주석 - 좋은 주석  (0) 2022.09.28
3장 함수 - 2  (2) 2022.09.25
3장 함수 - 1  (0) 2022.07.05
2장 의미 있는 이름  (0) 2022.07.01
public class Main {
	public static void main(String[] args) {
		System.out.println("         ,r'\"7");
		System.out.println("r`-_   ,'  ,/");
		System.out.println(" \\. \". L_r'");
		System.out.println("   `~\\/");
		System.out.println("      |");
		System.out.println("      |");
	}
}

 

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

곱셈  (0) 2022.06.15
나머지  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.BiFunction;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
	
		int value1 = scanner.nextInt();
		int value2 = scanner.nextInt();
		
		BiFunction<Integer, Integer, List<Integer>>  biFunc = 
				(val1,val2)->{
					List<Integer> list = new ArrayList<Integer>();
					int val001 = val2%10;
					int val010 = val2/10%10;
					int val100 = val2/100;
					
					list.add( val1*val001);
					list.add( val1*val010);
					list.add( val1*val100);
					list.add( val1*val2);
					
					return list;
				};
		List<Integer> resultList = calc(value1, value2, biFunc);

		for(Integer val : resultList) {
			System.out.println(val);
		}
		

	}

	public static List<Integer> calc(int a, int b, BiFunction<Integer, Integer, List<Integer>> biFunc){
		return biFunc.apply(a, b);
	}
}

핵심

자바의 정수형 연산 시 소수점 버림 활용 법

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

새싹  (0) 2022.06.15
나머지  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

문제


(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

 

입력


첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

 

출력


첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.

 

예시


입력 : 5  8  4

출력 

1

1

0

0

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		List<Integer> intList = new ArrayList<Integer>();
		intList.add(scanner.nextInt());
		intList.add(scanner.nextInt());
		intList.add(scanner.nextInt());

		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return (A + B) % C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return ((A%C) + (B%C))%C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return (A*B)%C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return  ((A%C) * (B%C))%C;
		}));

	}

	public static int calc(List<Integer> intList, Function<List<Integer>, Integer> func) {
		return func.apply(intList);
	}
}

핵심

알고리즘보다 자바8에 도입된 함수형 프로그래밍 개념을 사용

메서드를 값으로 다뤄 매개변수로 넣었음. 

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

새싹  (0) 2022.06.15
곱셈  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

문제


ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

입력


서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

출력


불기 연도를 서기 연도로 변환한 결과를 출력한다.

 

예시


입력 : 2541

출력 : 1998

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println(scanner.nextInt()-543);
		
	}
	
}

핵심

예시를 보고 보정 값인 -543을 구하기

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

곱셈  (0) 2022.06.15
나머지  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15
A/B  (0) 2022.06.15

+ Recent posts