728x90

 


Scanner

java.util.Scanner

 

객체 생성 및 사용 예시

import java.util.Scanner;

public class Main{

	public static void main(String args[]){
    
    	Scanner sc = new Scanner(System.in);	//객체 생성
        
        String s1 = sc.next();	// 구분자로 분리된 문자열 1개
        String s2 = sc.nextLine();	// 엔터 이전의 한 라인 전체
        int n1 = sc.nextInt();	// 구분자로 분리된 정수 1개
        double d1 = sc.nextDouble();	// 구분자로 분리된 실수 1개
        
        sc.close();	//객체 종료 : 안하면 경고 뜸.
    }

}

 


1. 문자열 입력

1) .next()

//input : hi there
String s1 = sc.next();	// s1 : hi
String s2 = sc.next();	// s2 : there
  • 콤마(,),공백(\t),엔터(\n)를 기준으로 문자열을 잘라서 입력받음.
  • 따라서 문자열 내에 엔터, 공백등은 입력되지 않음. 

 

2) .nextLine()

//input : hi there
String s = sc.nextLine();	// s : hi there
  • 엔터(\n)까지의 문자열 전체를 받음.
  • 문자열 내에 \n을 포함해서 받음을 주의.

 

📢next와 nextLine을 혼용해서 사용할 경우, next에서 입력받지 못한 \n(개행)을 주의해야 함. 

  • next에서 입력받지 못한 개행문자는 nextLine하나를 통째로 날려버릴 수 있음.
    즉, 다음 라인을 입력받지 못하고 개행문자 하나만 입력받게 됨.
  • 이런 경우 그냥 nextLine을 한 번 더 써서 개행을 지워주면 됨. 

 


2. 문자 입력받기

📢 .nextChar() 메소드는 존재하지 않음!

//input : abc def
char c = sc.next().charAt(0);	// c : a
  • 이런식으로 문자열을 받아온 다음에  charAt메소드를 사용해서 받아온다. 

 


3. 나머지 기타 등등 입력받기

  • 모두 .nextXX()의 형태이니 골라서 사용하면 됩니다.
int n = sc.nextInt();	
double d = sc.nextDouble();	
boolean b = sc.nextBoolean();

 


4. .hasNext()

  • 다음 토큰이 있으면 true, 없으면(즉, EOF의 경우) false를 반환.
  • EOF가 아니면 입력이 있을 때까지 무한 대기 하므로 주의가 필요.
while (sc.hasNext()) {
			//TODO
}
  • 이외에 hasNextInt(),hasNextDouble().. 등으로 hasNextXXX() 형식을 취하고 있으니 골라서 사용하면 됩니다. 
    구체적인 설명이 필요하다면 아래 문서를 참고하세요. ( Ctrl + F로 찾아서 사용하세요 )
 

Scanner (Java Platform SE 8 )

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match

docs.oracle.com

 

 

728x90
728x90


 

1. Math.random()

  • 0.0 이상 1.0 미만의 double형 난수를 반환
  • 정적 메소드. import할 필요 없음.
  • 현재 시간을 seed로 사용.
코드 반환값x
Math.random() 0.0 <= x < 1.0 인 실수
Math.random() * N 0.0 <= x < N 인 실수
(int) ( Math.random() * N ) 0 <= x < N 인 정수
(int) ( Math.random() * N ) + 1 1 <= x < N+1 인 정수 ( 1에서 N까지의 정수)

 


2. Random()

Java.util.Random()
  • 객체를 생성하여 사용 == 지속적으로 난수 생성 시 유리 ( 재활용 가능 )

 

객체 생성

Random rand = new Random();

 

seed 지정

long seed = System.currentTimeMills();

Random rand = new Random(seed);

//이후 seed 변경 시 아래의 메소드 사용
rand.setSeed(anotherseed);

 

난수 리턴 메소드

메소드 설명
boolean nextBoolean() 균일 분포의 boolean형 난수 리턴
int nextInt() 균일 분포의 int형 전 범위 난수 리턴 
int nextInt(int n) 균일 분포의 0이상 n 미만의 int형 난수 리턴
long nextLong() 균일 분포의 long형 전 범위의 난수 리턴
float nextfloat() 균일 분포의 0.0이상 1.0미만의 float형 난수 리턴
double nextDouble() 균일 분포의 0.0이상 1.0 미만의 double형 난수 리턴
double nextGaussian() 정규 분포(평균이 0, 표준편차가 1)의 난수 리턴

 

  • ex. 0에서 9사이의 난수를 리턴
int r = rand.nextInt(10); // 0<= r < 10
728x90
728x90


Java 전체 연산자 우선순위 및 연산 대상

우선 순위 연산자 결합 방향 연산 대상 부가 설명
1 []
.
++
--
+, -
~
!
new
(type)
👈 모든 데이터형
참조형
정수형, 실수형
정수형, 실수형
정수형, 실수형
정수형
논리형
참조형
모든 데이터형
배열 요소 지정
객체 멤버 지정
값 증가
값 감소
부호에 사용
비트 반전
논리 반전
객체 생성
형 변환 연산자
2 +, / , % 👉 정수형, 실수형 산술계산
3 +, - 
+
👉 정수형, 실수형
String 객체
산술계산
문자열 병합
4 <<
>>
>>>
👉 정수형 비트 연산자
5 <, <=, =>, > 
instanceof
👉 정수형, 실수형
참조형
값의 대소 비교
객체 타입 비교
6 ==
!=
==
!=
👉 기본형
기본형
참조형
참조형
비교 연산자
7 &
&
👉 정수형
논리형
비트 AND
논리 AND
8 ^
^
👉 정수형
논리형
비트 XOR
논리 XOR
9 |
|
👉 정수형
논리형
비트 OR
논리 OR
10 && 👉 논리형 조건 AND
11 || 👉 논리형 조건 OR
12 ? : 👉 모든 데이터형 삼항 연산자
13 =
+=, -=,..등의 연산 후 대입 연산자들
👈 모든 데이터형 대입 연산
연산 후 대입

 

📁비트 논리 연산자

연산자 기호 연산자 이름 결합 방향 기능
& 비트 AND 👉 두 피 연산자의 값이 둘 다 1인경우만 1
| 비트 OR 👉 두 피연산자 중 하나라도 1인 경우 1
^ 비트 XOR 👉 두 피연산자의 값이 다른 경우 1
~ 비트 NOT 👈 단항 연산자. 피연산자의 모든 비트를 반전시킴

 

📁비트 이동 연산자 ( Shift 연산자 )

연산자 기호 결합 방향 기능 ( a 연산자 b 의 경우)
<< 👉 a를 b만큼 왼쪽으로 이동. 빈 공간은 0으로 채움.
<<1 은 x2와 동일함. 
>> 👉 a를 b만큼 오른쪽으로 이동. 빈공간은 음수는 1, 양수는 0으로 채움.
>>1 은 /2와 동일함. 
>>> 👉 a를 b만큼 오른쪽으로 이동. 빈공간은 무조건 0으로 채움. 

✨그냥 2를 곱하고 나누는 것보다 속도가 빠름.

 

📁논리 연산자

연산자 기호 결합 방향 기능
& 👉 두개의 피연산자가 모두 true인 경우 true
| 👉 두 피연산자 중 하나라도 true인 경우 true
! 👈 단항 연산자. 값을 반전.
^ 👉 두 피연산자가 서로 다른 경우만 true
&& 👉 &와 동일한 기능 + 앞 피연산자가 false인 경우 뒤 연산자를 검사하지 않음.
|| 👉 |와 동일한 기능 + 앞 연산자가 true인 경우 뒤 연산자를 검사하지 않음.

 

 

728x90
728x90


형 변환

Type Casting

; 변수의 타입을 다른 타입으로 변환

  • primitive는 primitve끼리, reference는 reference끼리 형 변환.
  • primitive와 reference 간의 변환은 wrapper class 사용 필요.
  • boolean은 변환 불가. boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능.

 

1. Implicit Type Casting

묵시적 형변환 ( 자동 형변환 )
  • 더 큰 크기의 타입에 집어넣는 경우, 자동으로 더 큰 타입으로 형변환 됨.
int smaller = 10;
double bigger = smaller;
// 정수형은 실수형으로 자동 형 변환됨

 

2. Explicit Type Casting

명시적 형변환
  • 더 작은 크기의 타입으로 집어 넣는 경우, 명시적으로 타입을 지정해줘야 함.
  • 📌값 손실이 발생할 수 있음
double bigger = 100;
int smaller = (int) bigger;
//(int)를 통해 형변환을 명시해주어야 함

 

😈 여러 타입 연산 시에는 가장 큰 값으로 결과값을 얻음.

😈 byte, char, short 는 이항 연산시에 자동으로 int로 변환되어서 계산됨.

 

728x90
728x90


변수

variable
  • 메모리를 담는 그릇 : 공간
  • 메모리 공간에 값을 할당 후 사용
  • 공간의 크기는 타입 별로 상이.

 

타입

; 변수에 저장되는 데이터의 종류.

1. Primitve Type

기본형
  • 미리 정해진 메모리의 크기에 변수 값을 저장.
  • 흔히 알고 있는 int, char, .. 등등
타입 키워드 크기 (bit 단위) 범위
논리형 boolean 1 true, false
문자형 char 16 \u0000 ~ 
\uffff (0 ~ 2^15-1)
정수형 byte 8 -128 ~ 127
short 16 -32768 ~ 32767
int  32 -2147483648 ~ 2147483647
long 64 -9223372036854775808 ~ 
9223372036854775807
실수형 float 32 0x0.000002P-126f ~ 
0x1.fffffeP+127f
double 64 0x0.0000000000001P-1022 ~ 
0x1.fffffffffffffP+1023

 

2. Reference Type

참조형
  • 데이터를 heap에 저장하고 그 공간의 주소를 저장.
  • Class, Interface, Array, String .. 
728x90
728x90

 


출처:

 

Data Type Ranges

Learn more about: Data Type Ranges

docs.microsoft.com

 

 

Visual Studio 2019 기준

 

유형 이름 크기
(byte)
기타 이름 값의 범위
int 4 signed –2,147,483,648 ~ 2,147,483,647
unsigned int 4 unsigned 0 ~ 4,294,967,295
__int8 1 char -128 ~ 127
unsigned __int8 1 unsigned char 0 ~ 255
__int16 2 short
short int 
signed short int
–32,768 ~ 32,767
unsigned __int16 2 unsigned short 
unsigned short int
0 ~ 65,535
__int32 4 signed, 
signed int, 
int
–2,147,483,648 ~ 2,147,483,647
unsigned __int32 4 unsigned 
unsigned int
0 ~ 4,294,967,295
__int64 8 long long
signed long long
–9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned __int64 8 unsigned long long 0 ~ 18,446,744,073,709,551,615
bool 1 없음 false or true
char 1 없음 기본적으로-128 ~ 127

(/J로 컴파일한 경우 0에서 255) 
signed char 1 없음 -128 ~ 127
unsigned char 1 없음 0 ~ 255
short 2 short int
signed short int
–32,768 ~ 32,767
unsigned short 2 unsigned short int 0 ~ 65,535
long 4 long int 
signed long int
–2,147,483,648 ~ 2,147,483,647
unsigned long 4 unsigned long int 0 ~ 4,294,967,295
long long 8 없음 (__int64 와 동일 ) –9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
unsigned long long 8 없음
(unsigned __int64와 동일)
0 ~ 18,446,744,073,709,551,615
enum 다름 없음  
float 4 없음 3.4E±38(7개의 자릿수)*
double 8 없음 1.7E±308(15개의 자릿수)*
long double double과 동일 없음 double과 동일
wchar_t 2 __wchar_t 0 ~ 65,535

 

signed  VS  unsigned

  • signed : 부호가 있는
  • unsigned : 부호가 없는 (양수만 표현)

 

지수 표기법

    n E M = n * 10^M 

  • float 와 double의 범위를 보면 숫자가 특이하게 표현되어 있는 것을 볼 수 있습니다.
  • 이는 컴퓨터에서 아주 크거나 작은 수를  표기하는 방식입니다.
  • float의 경우에만 간단히 바꾸어 보자면 아래와 같습니다.
    ->              3.4E±38 = 3.4*10^-38 ~ 3.4*10^38

 

float VS double

  • float와 double 모두 실수를 표현하는 데이터 타입이지만 float가 double 보다 큰 수를 표현 할 수 있는 것을 볼 수 있습니다.
  • 하지만 그만큼 오차가 많으니 더 많은 소수점 자리수를 표현할 수 있는 double의 사용을 권장하고 있습니다.

 

 

 

728x90
728x90


기본 입력 함수


 

input()

  • 가장 기본적인 입력 함수입니다.
  • 개행 문자 이전까지의 1 line을 읽어옵니다. 
str = input()	#input : hello
print(str)	# output : hello

 

  • 특별히 형식을 정해주지 않으면 string 형식으로 저장함을 유의합니다.
  • 다른 형식으로 저장하고 싶다면 아래와 같이 형 변환을 거쳐 주면 됩니다. 
num = int(input())	#input : 3

 


split()

  • 만약에 input이 한 라인에 2개 이상이라면 어떻게 할까요?
  • split 메서드를 활용하면 공백을 기준으로 input을 쪼개어 리스트 형태로 반환해줍니다.
a, b = input().split()	#input : Hi there
print(a)	#Hi
print(b)	#there
  • 위처럼 split()에 인자를 넣지 않으면 기본으로 공백을 구분자로 인식합니다.
  • 아래와 같이 원하는 구분자를 인자로 넣어서 사용할 수도 있습니다.
    a, b = input().split('/')	#input : Hi/there/​

 


map()

  • split된 여러개의 input에 대하여 일괄적으로 형 변환을 할 때는 map을 사용합니다.
  • map의 기본 형식은 아래와 같습니다.
    • map('적용할 함수','순회 가능한 데이터')	//리턴은 map object
      python에서 map의 활용은 무궁무진하지만 여기서는 기본 입출력 방법만 다루겠습니다.
      map에 대한 더 자세한 내용은 아래의 포스트를 참고 해 주세요.
      -> 추가 예정
  • 여러개의 int 형 input을 받는 경우
    • #input : 1 2
      a, b = map(int, input().split())
  • 리스트 형태로 받고 싶은 경우
    • #input : 1 2 3 4 5
      a = list( map(int, input().split()) )
      map은 map object 형태를 반환하니 리스트로 변환해서 사용합니다. 

 


 

sys.stdin.readline()

  • 백준과 같은 채점 사이트에서 반복문으로 계속 입력값을 받는 문제에서 input()을 사용하면 시간초과를 받는 경우가 왕왕 있습니다.
  • 이럴 때는 sys.stdin.readline() 를 대신 사용합니다.

 

  • 헤더 파일
    • import sys

 

  • 기본적으로, input()과 사용 방법이 거의 동일합니다.
    • import sys
      
      #input : 1 2
      a, b = map(int, sys.stdin.readline().split())
  • 다만, input() 과 달리 개행문자(\n)까지 함께 입력 받으므로 주의합니다.
    • 개행문자를 제외하고 싶은 경우, rstrip 메서드를 사용합니다.
    • import sys
      
      #input : 'Hi there\n'
      str = sys.stdin.readline().rstrip()​

 


 

기본 출력 함수


 

print()

  • 가장 기본적으로 사용하는 출력 함수입니다.
  • print( value1, value2, ... , sep='구분자: 기본_공백', end='마지막 문자: 기본값_\n(개행)')
    ex.
    • name = 'Kim'
      id = 12345
      nex = '--->'
      
      print(name,id,sep='.',end=nex)
      print('next line is here')
      
      #output : Kim.12345--->next line is here
  • print() formatting 문서는 아래를 참고 해 주세요. ( 추가 예정 )

 

 

 

728x90

'언어 공부 > Python' 카테고리의 다른 글

[Python] 이스케이프 시퀀스 ( Escape Sequence )  (0) 2021.05.01
728x90


기본 입출력 함수


헤더 파일

#include <iostream>
  • 위의 헤더파일을 반드시 추가해야 사용 가능합니다.
  • cin,cout 모두 std 네임스페이스 내에 존재합니다.

 

 

참고로 아래의 코드를 추가하면 std:: 를 붙이지 않고도 사용할 수 있습니다.

 

 

1.전체 네임스페이스를 std로 선언하는 방식.

이는 추후에 문제가 생길 수 있는 방식이니 초반에만 사용하도록 합니다.

using namespace std;​

 

2. cin,cout에 대해서만 네임스페이스를 지정해주는 방식

이 방식이 좀 더 권장되는 방식입니다. 

(사실 귀찮아서.. 저는 1번도 자주 사용합니다.) 

using std::cin;
using std::cout;

 


std::cin 

 

#include <iostream>	

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
}
  • 가장 기본적인 cin의 활용 방식입니다.
  • 백준 저지의 경우라면 입력으로 보여주는 숫자들이 프로그램 흐름상 차례로 변수에 입력되게 됩니다.
  • >> 의 방향에 유의하도록 합시다. 저는 변수에게 집어넣는다고 연상해서 외웠습니다.

std::cout

#include <iostream>

int main(){
	int num;	//변수 선언
	std::cin >> num;	//변수 입력
	std::cout << num;	//변수 출력
}
  • 앞서 cin으로 값을 입력받은 num 변수를 출력하는 모습입니다.
  • cin과 화살표 방향이 반대임을 꼭 유의하도록 합니다.

 

 

-여러개의 변수를 한꺼번에 입출력 시

std::cin >> a >> b;
std::cout << a << b;
    •  너무 횟수가 늘어나는 경우에는 당연히 반복문 등을 활용하도록 합니다.

 

 

 


 

시간 제한 환경에서의 빠른 입출력


 

  • 무턱대고 cin과 cout을 쓰다 보면, 백준 저지등에서 시간초과가 날 수 있습니다. 속도가 아주 느리거든요.
  • 속도가 느린 이유는 저도 자세히는 설명이 어렵지만(잘 모름), 대체로 2가지로 추려볼 수 있습니다.
    1. 타 언어(C나 Java등)와 달리 입출력하는 데이터의 형식을 지정하지 않습니다.(데이터가 int인지, string인지..) 아주 편리하죠.
    2. iostream이 cstdio와 동일한 버퍼 시스템을 사용하기 때문에. (잘 이해가 되지 않으나 printf, scanf등을 모두 호출한다고 함)
  • 그런데, 느리다고 해서 나쁜 걸까?
    • 그렇지는 않습니다. 아래의 방식들은 시간 제한이 있는 코딩테스트 등의 특수한 상황에서의 대처법일 뿐입니다.
    • cin, cout이 나중에 나온 언어이니 만큼 안정성, 확장성 등에서는 더 뛰어나다고 합니다. 

 

 

1.  C의 입출력 사용하기

 

헤더파일

 

#include <stdio.h>	//C의 방식
#include <cstdio>	//C++의 방식
  • stdio.h와 cstdio는 namespace가 다르다곤 하지만.. 다들 취향껏 사용하시는 듯 하니 골라서 쓰시면 됩니다.

 

 

scanf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);	//입력
}
  • %d란 무엇일까요?  cin과 달리 printf는 입력받는 데이터의 형식을 지정해 주어야 합니다. 
  • 바로 그 데이터의 형식을 알려주는 문자를 형식지정자 라고 합니다. 
    • 형식지정자에 관해서는 아래의 페이지를 참고 해 주세요! (추가 예정)

 

  • 그렇다면 입력 받는 변수 앞에 &를 붙이는 이유는 무엇일까요? (참고로 &는 코딩 초기에 자주 까먹습니다. 유의하세요.)
  • C에서 포인터를 배웠다면 아시겠지만.. &를 변수 앞에 붙여주면 변수의 메모리 주소라는 의미입니다.
  • 여기서는 num의 메모리 주소로 가서 입력받은 int 데이터를 입력하라는 뜻으로 보면 되겠죠.

 

  • 한번에 여러개의 입력을 받을 때는 아래처럼 사용하면 됩니다.
scanf("%d %d %d",&a,&b,&c);

 


printf

 

#include <cstdio>

int main()
{
	int num;
	scanf("%d",&num);
	printf("%d",num);	//출력
}
  • scanf와 거의 동일한 모양입니다. 다만 변수 앞에 &가 붙지 않음을 유의하세요.
  • scanf와 달리 문자열과 함께 사용할 수 있습니다. 아래와 같습니다.
printf("%d 더하기 %d 는 %d 입니다.\n",a,b,a+b);

 


 

2.  버퍼 동기화 끊기 + untie 

 

버퍼 동기화 끊기

ios_base::sync_with_stdio(false);
  • 앞서 말한 cstdio와 iostream의 버퍼 동기화를 끊어줍니다.
  • 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.
  • 다만, 이걸 사용한 경우에 cin,cout을 사용하면서 printf,scanf를 동시에 사용하는 것은 불가능하니 유의합시다.

 

untie

cin.tie(NULL);
  • cin과 cout의 tie를 풀어줌으로써 속도를 향샹시키는 방식입니다.
    • cin과 cout의 tie의 의미 : 서로의 IO작업 전에 자동으로 버퍼를 비웁니다.
  • 따라서 이 코드를 사용한 경우에는 수동으로 버퍼를 비워줘야 합니다. (대체로 코딩테스트에서는 잘 없음)
  • 마찬가지로 메인 함수 안, 가장 윗줄에 추가하여 사용합니다.

 

 

저는 개인적으로 애초에 아래의 형식을 기본으로 두고 사용하는 편입니다. (대체로 백준에서는 문제 없었음)

#include <iostream>

using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    
	/*
	TODO
	*/

}

 

728x90

+ Recent posts