형변환

자료형들을 강제로, 혹은 자동으로 변환하는 경우가 있다. 같은 형식의 데이터 타입을 변환하기도 하고, 다른 형식의 데이터 타입 간의 변환이 이루어지기도 한다.

 

형변환의 포함관계

byte < short < int < long <<< float < double

 

용량 순서로 기억하면 편하며 정수보다는 실수가 큰 범위이다.

 

강제 형변환(명시적 형변환)

int a = 128;
short b = (short) a;
byte c = (byte) a; // -128 ~ 127

큰 데이터 타입을 작은 데이터 타입으로 변환하거나, 두 가지 데이터 타입이 자동 변환될 수 없을 때 직접 지정하여 변환하는 것이다.

변수 c처럼 -128이라는 뜬금 없는 값이 나온 이유는 byte 타입이 128이라는 숫자를 포용할 수 없기 때문에 오버플로우가 일어난 것이다.

 

자동 형변환(암시적 형변환)

int m = 80;
double n = m;

처음에 대입한 변수 m은 80이라는 정수형으로 출력되고, n은 80.0은 실수형으로 출력된다.

m에 있는 정수형 값이 n에 대입되기 전에 double로 형변환이 되기 때문에 실수형으로 출력된 것이다.

 

int e = 10;
short f = 20;

short g = (short) (e + f);

연산이 일어날 떄는 큰 범위를 따라간다. 연산에 대해서 형변환를 하고 싶다면 연산이 포함된 표현식에도 괄호()를 하여 결과물에 대해 전체를 형변환 하는 코드를 작성해야한다.

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
변수와 자료형, 그리고 상수  (0) 2023.05.08
Java란?  (0) 2023.05.02
변수(Variables)

데이터가 저장되는 공간

 

변수의 특징

  • 1개의 변수에는 1개의 값만 할당 할 수 있다.
  • 변수에 지정된 값은 재할당을 통해 변경 가능하다.
  • 값의 형태에 맞는 자료형을 사용해야한다. 예) String = 1234; (x) 
  • 변수명은 소문자로 시작해야한다.
  • 대소문자를 구분해야하며 공백은 포함이 불가능하다.
  • 자바 예약어(int, double, String 등)는 변수로 사용할 수 없다.

공백을 사용해야 할 때는 대문자를 사용하여 구분한다.이러한 방법을 카멜 케이스(Camel Case)라고 한다. 예) int productPrice = 10000;

 

 

데이터 타입

기본형(PrimitiveType)

정수형

  • byte(1 byte - 8 bits) : -2^7 ~ 2^7-1(-128 ~ 127)의 범위를 나타낼 수 있다.
  • short(2 bytes) : -2^15 ~ 2^15-1(-32,768 ~ 32,767)의 범위를 나타낼 수 있다.
  • int(4 bytes) : -2^31 ~ 2^31-1의 범위를 나타낼 수 있다.
  • long(8 bytes) : -2^63 ~ 2^63-1의 범위를 나타낼 수 있다.

일반적으로 많이 사용하는 정수형 데이터는 int 타입이며, 보통 long 타입은 웹서비스나 웹 애플리케이션을 만들 때 객체 각각의 고유한 값을 가지는 아이디를 만들 때 사용된다.

 

실수형

  • double(8 bytes) : 소수점 15자리까지의 정밀도
  • float(4 bytes) : 소수점 7자리까지의 정밀도

float 데이터를 다룰 때 뒤에 f를 붙여야하는 번거로움이 있기 때문에 일반적으로 실수형 데이터를 표현할 때에는 double 타입을 사용한다.

 

문자형

  • char(2 bytes) : 작은따옴표('')를 사용한다.

문자열은 말 그대로 문자를 나열한 것이고 문자형 데이터는 문자 한 개만 다룰 수 있는 데이터 타입이다. 정수를 입력하면 아스키(ascii)코드로 변환되어 나온다. 그 외에도 16진수 형태의 유니코드를 입력하여도 문자형으로 출력된다.

 

논리형

  • boolean(1 byte)

참거짓(True, False) 값. 불, 불린, 불리언 등으로 불린다. 참과 거짓 외에도 논리적으로 판단할 수 있는 표현식을 넣어도 된다. 

 

 

참조형(Reference Type)

참조형 데이터의 값 => 힙 메모리

변수에 대입되는 값 => 힙 메모리 영역의 주소값

 

참조형 데이터 타입은 원칙적으로 new 연산자를 이용하여 객체를 구성하는 방식이다.

String = new String(original: "Hello!");
System.out.printIn(a);

참조형 데이터의 값을 나타내는 부분(Hello!)은 변수 a가 아닌 힙 메모리 영역에 생성된다. 변수(a)에 대입되는 실제 값는 힙 메모리 영역의 주소값이 대입된다. 즉, a는 힙 메모리의 어느 곳에 Hello!라는 문자열이 있는지 주소만 가지고 있을 뿐 값을 가지고 있는 것은 아니다. 

그래서 String 같은 경우, new 연산자를 활용하지 않고 값 자체를 변수에 대입하여 사용한다. 이를 리터럴(Literal) 방식이라고 한다.

String b = "Hello!";

그럼 a와 b의 값은 같은 주소 값을 가지고 있을까?

if (a == b) {
	System.out.printin("a == b");
}

결과는 아니다. 같은 Hello!라는 값이어도 a라는 변수, b라는 또다른 변수를 선언했기 때문이다.

같은 값으로 또다른 변수를 선언하여 비교해보자.

String c = "Hello!";
if (b == c) {
	System.out.printin("a == b");
}

그런데 이번에는 b와 c가 힙 메모리에 같은 데이터를 가르키고 있다고 나온다.

리터럴 방식으로 문자열을 대입하면 기존에 힙 메모리에 동일한 값이 있는지 먼저 확인한다. 그리고 동일한 값이 있으면 새롭게 그 객체를 힙 메모리에 만들지 않고 기존의 주소를 가져간다. new 연산자 방식은 new 연산자를 새로 만드는 작업만 한다. 그렇기 때문에 기존에 같은 문자열 데이터가 있든 없든 무조건 새로 생성한다.

 

 

상수(Constants, final variables)

변수와 상반되는 개념

 

상수의 특징

  • 한 번 값이 할당되면 이후에 재할당이 불가능하다.
  • 전체를 대문자로 표시하고 단어간 구분은 _로 한다.

프로그램 내에서 한 번이라도 변경이 필요한 값들은 상수로 선언하면 안된다. 공통적으로 값을 곱해주어야한다던지, 공식 같은 로직에서만 사용해야한다.

 

 

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
형변환  (0) 2023.05.08
Java란?  (0) 2023.05.02

 

import turtle
import random

## 전역 변수 선언 부분 ##
myTurtle, tX, tY, tColor, tSize, tShape = [None] * 6
shapeList = []
playerTurtles = [] # 거북이 2차원 리스트
swidth, sheight = 500, 500

## 메인 코드 부분 ##
if __name__ == "__main__" :
    turtle.title('거북이 리스트 활용')
    turtle.setup(width = swidth + 50, height = sheight + 50)
    turtle.screensize(swidth, sheight)

    shapeList = turtle.getshapes()
    for i in range(0, 100) :
        random.shuffle(shapeList)
        myTurtle = turtle.Turtle(shapeList[0])
        tX = random.randrange(-swidth / 2, swidth / 2)
        tY = random.randrange(-sheight / 2, sheight / 2)
        r = random.random(); g = random.random(); b = random.random()
        tSize = random.randrange(1, 3)
        playerTurtles.append([myTurtle, tX, tY, tSize, r, g, b])

    for tList in playerTurtles :
        myTurtle = tList[0]
        myTurtle.color((tList[4], tList[5], tList[6]))
        myTurtle.pencolor((tList[4], tList[5], tList[6]))
        myTurtle.turtlesize((tList[3]))
        myTurtle.goto((tList[1], tList[2]))
    turtle.done()

 

 

DeprecationWarning: non-integer arguments to randrange() have been deprecated since Python 3.10 and will be removed in a subsequent version

 

아마 파이썬 3.10 버전 이상을 쓰는 사람이라면 이런 오류가 뜨며 실행되지 않았을 것이다.

찾아보니 Python 3.10에서 randrange() 함수에 정수가 아닌 인수를 전달하는 것을 더 이상 허용하지 않으며, 향후 Python 버전에서 제거될 예정이라고 한다. 즉, 위 코드에서 실수형 값을 반환하고 있기 때문에 정수형으로 전환해주어야 한다는 뜻이다.

 

그래서 20, 21행 코드를 아래와 같이 수정해야한다.

tX = random.randrange(-swidth // 2, swidth // 2)
tY = random.randrange(-sheight // 2, sheight // 2)

 

 

Self Study

6-1 Code06-03.py를 0과 100 사이에 있는 7의 배수 합계를 구하도록 수정해 보자.

출력 결과
0과 100 사이에 있는 7의 배수 합계 : 735

 

더보기

답 :

i, hap = 0, 0

for i in range(0, 100, 7) :
    hap = hap + i

print("0과 100 사이에 있는 7의 배수 합계 : %d" % hap)

 

6-2 Code06-06.py를 수정해서 입력한 단을 거꾸로 출력하도록 해 보자.

출력 결과
단을 입력하세요 : 7
9 X 7 = 63
8 X 7 = 56
... 중략 ...
1 X 7 = 7

 

i, dan = 0, 0

dan = int(input("단을 입력하세요 : "))

for i in range(9, 0, -1) :
    print("%d X %d = %2d" % (dan, i, dan*i))

 

6-3 Code06-07.py를 각 단의 제목이 출력되도록 수정해 보자.

출력 결과
## 2단 ##
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6

 

더보기

답 :

i, k = 0, 0

for i in range(2, 10, 1) :
    print("## %d단 ##" % (i))
    for k in range(1, 10, 1) :
        print("%d X %d = %2d" % (i, k, i * k))
    print("")

 

6-4 Code06-08.py를 구구단이 거꾸로 출력되도록 수정해 보자.

힌트 range() 함수의 값을 큰 값에서 작은 값으로 변경되도록 해야 한다.

 

더보기

답 :

## 전역 변수 선언 부분 ##
i, k, guguLine = 0, 0, ""

## 메인 코드 부분 ##
for i in range(9, 1, -1) :
    guguLine = guguLine + ("# %d단 #" % i)

print(guguLine)

for i in range(9, 0, -1) :
    guguLine = ""
    for k in range(9, 1, -1) :
        guguLine = guguLine + str("%2dX %2d= %2d" % (k, i, k * i))
    print(guguLine)

 

6-5 Code06-05.py를 while 문으로 수정해 보자.

힌트 Code06-09.py를 참고한다.

 

더보기

답 :

i, hap = 0, 0
num1, num2, num3 = 0, 0, 0

num1 = int(input("시작값을 입력하세요 : "))
num2 = int(input("끝값을 입력하세요 : "))
num3 = int(input("증가값을 입력하세요 : "))

i = num1
while i < num2+1 :
    hap = hap + i
    i = i + num3

print("%d에서 %d까지의 %d씩 증가시킨 값의 합계 : %d" % (num1, num2, num3, hap))

 

6-6 $를 입력하면 while 문을 빠져나가도록 Code06-12.py를 수정해 보자.

 

더보기

답 :

hap = 0
a, b = 0, 0

while True :
    a = input("더할 첫 번째 수를 입력하세요 : ")
    if a == "$" :
        break
    a = int(a)
    b = int(input("더할 두 번째 수를 입력하세요 : "))
    hap = a + b
    print("%d + %d = %d" % (a, b, hap))

print("$을 입력해 반복문을 탈출했습니다.")

 

6-7 출력 결과가 동일하도록 Code06-13.py를 while 문으로 변경해 보자.

 

더보기

답 :

hap, i = 0, 0

while i < 101 :
    i += 1
    hap += i

    if hap >= 1000 :
        break

print("1~100의 합계를 최초로 1000이 넘게 하는 숫자 : %d" % i)

 

6-8 Code06-15.py를 모두 for 문으로 변경해 보자. 출력은 하트 모양을 사용하는데, 하트 모양의 유니코드는 16진수 '2665'이다.

*글꼴 차이로 기울인 형태로 보일 수 있음.

 

더보기

답 :

## 전역 변수 선언 부분 ##
i, k = 0, 0

## 메인 코드 부분 ##
i = 0
for i in range(0, 9) :
    if i < 5 :
        k = 0
        for k in range(0, 4 - i) :
            print(' ', end = '')
            k += 1
        k = 0
        for k in range(0, i * 2 + 1) :
            print('\u2665', end = '')
            k += 1
    else :
        k = 0
        for k in range(0, i - 4) :
            print(' ', end = '')
            k += 1
        k = 0
        for k in range(0, (9 - i) * 2 -1) :
            print('\u2665', end = '')
            k += 1
    print()
    i += 1

 

연습문제

1. for 문의 기본 형식을 참고해 빈칸을 채우세요.

시작값, 증가값, 끝값, 끝값+1
for 변수 in range([     ①     ], [     ②     ], [     ③     ]) :
       이 부분을 반복

 

더보기

답 : ① 시작값     ② 끝값+1     ③ 증가값

 

2. 다음 for 문은 몇 번 반복되는지 고르세요.

for i in range(0, 101, 1) :
	print("여기를 반복")

① 0번     ② 1번     ③ 100번     ④ 101번

 

더보기

답 : 4

 

3. 다음 중 출력되지 않는 값을 하나 고르세요.

for i in range(5, -1, -1) :
	print("%d")

① 5     ② 1     ③ 0     ④ -1

 

더보기

답 : 4

 

4. 다음 코드는 1부터 1000까지 5의 배수의 합계를 출력하는 코드입니다. 반칸에 올바른 코드를 고르세요.

hap = 0
for i in range(          ) :
	hap += i
print(hap)

① 0, 1000, 5

② 0, 1001, 5

③ 1, 1000, 5

④ 1, 1001, 5

 

더보기

답 : 2

 

5. 다음은 15단을 거꾸로 출력하는 코드입니다. 빈칸을 채우세요.

실행 결과
15 X 9 = 135
15 X 8 =120
15 X 7 = 105
15 X 6 = 90
15 X 5 = 75
15 X 4 = 60
15 X 3 = 45
15 X 2 = 30
15 X 1 = 15

 

dan = 15
for i in range(     ①     ) :
	print("%d X %d = %3d" % (     ②     ))

 

더보기

답 : 9, 0, -1     ② dan, i, dan * i

 

6. 다음 코드가 "쿡북~"을 몇 번 출력하는지 쓰세요.

for i in range(4) :
	for j in range(3) :
    	for k in range(2) :
         print("쿡북~")

 

더보기

답 : 24번

 

7. while() 문의 문법에 맞는 것을 고르세요.

① while(초깃값, 끝값+1, 증가값)

while(반복횟수)

while(조건식)

while(초깃값)

 

더보기

답 : 3

 

8. 다음은 for 문을 사용해서 1234부터 4567까지 444의 배수의 합계를 구하는 코드입니다. while 문으로 변경해서 코드를 다시 작성하세요.

hap = 0
for n in range(1234, 4568) :
	if n%444 == 0 :
    	hap += n
        
print(hap)

 

 

더보기

답 :

hap, n = 0, 1234
while n < 4567 :
        n += 1
        if n%444 == 0 :
                hap += n
        
print(hap)

 

9. for 문을 사용해서 3333부터 9999까지의 숫자 중에서 1234의 배수의 합계를 구하되, 합계가 100000(십만)이 넘기 직전까지만 합계를 구하는 코드를 작성하세요. 단, 코드에는 continue와 break를 모두 사용해서 작성하세요.

출력 결과
40722

*교재의 문제 지문에서는 97063이라고 나와 있으나, 문의 결과 40722이 맞다고 답장이 와서 수정하여 올립니다.

 

더보기

답 :

hap, i = 0, 0

for i in range(3333, 10000) :
    if i % 1234 != 0 :
        continue
    
    hap += i

    if hap >= 100000 :
        break

print(hap)

 

10. 182쪽의 [응용예제 01]을 수정해 입력한 숫자의 두 배만큼 별을 출력하도록 프로그램을 작성하세요. 예를 들어 5914를 입력하면 다음과 같이 출력됩니다.

힌트 별 모양의 유니코드는 '\u2605'이다.

 

더보기

답 :

## 변수 선언 부분 ##
i, k, starNum = 0, 0, 0
numStr, ch, starStr = "", "", ""

## 메인 코드 부분 ##
if __name__ == "__main__" :
    numStr = input("숫자를 여러 개 입력하세요 : ")
    print("")
    i = 0
    ch = numStr[i]
    while True :
        starNum = int(ch)

        starStr = ""
        for k in range(0, starNum * 2) :
            starStr += "\u2605"
            k += 1

        print(starStr)

        i += 1
        if (i > len(numStr) -1) :
            break

        ch = numStr[i]

 

11. 3부터 100까지의 숫자 중에서 소수(Prime Number)를 출력하는 코드를 작성하세요. 소수란 1과 자기자신만으로 나누어 떨어지는 정수를 말합니다. 즉, 2부터 자기자신 -1까지 나눠봐서 한 번도 나누어 떨어지지 않으면 소수입니다. 예로 5는 2, 3, 4로 각각 나누어서 한 번도 나누어 떨어지지 않으므로 소수입니다. 13도 2, 3, ..., 12까지 한 번도 나누어 떨어지지 않으므로 소수입니다.

3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

 

더보기

답 :

num, i = 0, 0

for num in range(3, 101) :
    for i in range(2, num - 1):
        if num % i == 0 :
            break
    else :
        print(num, end = ' ')

 

12. 거북이가 화면에 별모양을 계속 그리는 코드를 작성하세요. 별의 한 변은 10~200 사이로 하고, 별의 위치 및 색상은 랜덤하게 지정합니다.

힌트 별은 5개 선분으로 되어 있고, 144도씩 각도를 회전하면서 그리면 된다.

 

더보기

답 :

맨처음 시작 할 때 거북이가 변 하나를 그리는데 왜인지 원인을 찾지 못했습니다. 참조만 해주세요!

import turtle
import random

## 전역 변수 선언 부분 ##
swidth, sheight = 500, 500

## 메인 코드 부분 ##
turtle.title('거북이가 랜덤한 별 그리기')
turtle.shape('turtle')
turtle.setup(width = swidth + 50, height = sheight + 50)
turtle.screensize(swidth, sheight)
turtle.pensize(3)

while True :
    angle = random.randrange(0, 360)
    dist = random.randrange(1, 100)
    turtle.left(angle)
    turtle.forward(dist)

    side = random.randint(10, 200)
    r = random.random()
    g = random.random()
    b = random.random()
    turtle.pencolor((r, g, b))
    turtle.pendown()
    for i in range(0, 5):
        turtle.forward(side)
        turtle.left(144)
    turtle.penup()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

+ Recent posts