변수(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)

 

 

오늘의 단어

narrative / dialect / register / provide / rally

 

 

narraive

1. 묘사, 기술, 이야기

2. 서술(기법)

 

예문

I like the narrative of the book.

나는 그 책의 이야기를 좋아한다.

 

The novel contains too much dialogue and not enough narrative.

그 소설은 대화가 너무 많이 포함되어 있고 서술이 충분하지 않다.

 

 

dialect

방언, 사투리

 

예문

"Drilling" is one term among many in drill's original slang dialect, along with the omnipresent "opps" (opposition, competitors), "bando" (abandoned house, used to sell drugs) and "L" (referring to the defeat or loss of a rival).

"Drilling"은 "oops"(상대측, 경쟁자), "bando"(마약 거래로 사용되는 폐허), "L"(상대를 패배시키거나 처부수는 것)과 함께 드릴의 원조 속어 방언 중 하나이다.

 

It was difficult to understand the local dialect.

그 지역 사투리는 알아듣기 어려웠다.

 

 

register

1. 등록하다, 기제하다, 신고하다

2. (견해를) 표명하다

3. 기록부, 명부

4. 음역

 

예문

We learned how to create and register a new web page.

우리는 새로운 웹페이지를 만들고 등록하는 법을 배웠다.

 

They could find no register of her death.

그들은 명부에서 그녀의 죽음을 발견 할 수 없었다.

 

She has a good high register when she sings.

그녀는 노래할 때 고음을 잘 낸다.

 

 

provide

1. 제공하다, 주다

2. 규정하다

 

예문

We are here to provide a service for the public.

우리는 대중에게 서비스를 제공하기 위해 여기 있는 것이다.

 

Corey Johnson says producers and engineers added these sounds to compensate for rappers not providing enough lyrics to fill bars.

코리 존슨은 프로듀서와 엔지니어가 래퍼들에게 박자를 채울 만큼의 충분한 가사를 주지 않은 것을 보상하기 위해 이러한 소리를 추가했다고 말했다.

 

 

rally

1. 집회

2. 결집[단결]하다[시키다]

3. 회복되다, 활기를 되찾다

 

예문

Georgia congresswoman Marjorie Taylor Greene plans to hold a pro-Trump rally near the court on Tuesday.

조지아주 국회의원 마조리 테일러 그린은 화요일 법원 근처에서 친트럼프 집회를 열 계획이다.

 

The patient will soon rally.

그 환자는 곧 회복될 것이다.

 

 

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