1. 리스트의 형태

colors = ["red", "blue", "green", "white", "black"]

 

2. 리스트 인덱싱 및 슬라이싱

colors = ["red", "blue", "green", "white", "black"]

print(colors[3]) 
=> white

print(colors[2:4]) 
=> ['green', 'white']

 

3. 리스트에 원소 추가

colors = ["red", "blue", "green", "white", "black"]
colors.append("yellow")
print(colos)
=> ['red', 'blue', 'green', 'white', 'black', 'yellow']

shapes = []
shapes.append("circle")
print(shapes)
=> ['circle']

 

4. 리스트의 원소 수정

colors = ["red", "blue", "green", "white", "black"]
print(colors[2])
=> green

colors[2] = "purple"
print(colors[2])
=> purple

 

5. 리스트 중간에 삽입

colors = ["red", "blue", "green", "white", "black"]
colors.insert(1, "orange")
print(colors)
=>['red', 'orange', 'blue', 'green', 'white', 'black']

 

6. 리스트의 원소 삭제

colors = ["red", "blue", "green", "white", "black"]
del colors[1]
print(colors)
=>['red', 'green', 'white', 'black']

 

7. 두 리스트의 결합

colors = ["red", "blue"]
shapes = ["circle", "square"]

colors.extend(shapes)
print(colors)
=> ['red', 'blue', 'circle', 'square']
colors = ["red", "blue"]
shapes = ["circle", "square"]

colorandShape = colors + shapes
print(colorandShape)
=> ['red', 'blue', 'circle', 'square']

 

8. 리스트의 정렬(숫자 뿐 아니라 글자도 알파벳 순서대로 오름차순 정렬)

number = [5, 3, 8, 6, 7, 2]
number1 = sorted(number)

colors = ["red", "blue", "green", "white", "black"]
colors1 = sorted(colors)

과일 = ["사과", "배", "감", "포도", "수박"]
과일1 = sorted(과일)


print(number1)
=> [2, 3, 5, 6, 7, 8]

print(colors1)
=> ['black', 'blue', 'green', 'red', 'white']

print(과일1)
=> ['감', '배', '사과', '수박', '포도']

 

9. 리스트의 정렬(내림차순)

number = [5, 3, 8, 6, 7, 2]
number1 = sorted(number, reverse=True)
print(number1)
=> [8, 7, 6, 5, 3, 2]

 

10. 인덱스 찾기

colors = ["red", "blue", "green", "white", "black"]
print(colors.index("green"))
=> 2

 

 

오늘은 파이썬의 기초를 공부했습니다.

 

1. 슬라이싱 : 문자열의 일부를 가져오는 것

juminNum = "830276-1234569"
print(juminNum[:][2:6][-2])

=> 7

위 코드의 결과는 7입니다. 

juminNum[:]은 830276-1234569, 즉 문자열 전체를 가져오고

juminNum[:][2:6]는 juminNum[:]의 [2:6]에 해당하는 0276을 가져옵니다.

juminNum[:][2:6]는 0276의 인덱스 -2 값은 7입니다.

 


 

2. 대소문자

Word = "PYthon3"
WORD = Word.upper()
word = Word.lower()
print(Word, WORD, word)

=> PYthon3 PYTHON3 python3

여기서 두가지 사실을 알 수 있습니다.

1. upper와 lower 명령어를 통해 문자열을 대문자와 소문자로 변경할 수 있다.

2. 파이썬의 변수는 대소문자를 구분한다.

 


 

3. 문자열 변경 : 대부분의 문서 편집 툴에 있는  "찾기 및 대치"에 해당

word = "apple"
word = word.replace("p", "q")
print(word)

=> aqqle

 


4. 파이썬에서의 메모리 관리 방식

더보기
더보기

파이썬의 데이터 저장과 변수 바인딩

핵심 개념

1. 변수는 상자가 아니라 '라벨(이름표)'이다

파이썬에서 변수는 데이터를 직접 담는 상자가 아니에요. 메모리 어딘가에 있는 데이터 객체에 붙이는 이름표 같은 거죠.

word = 'apple'  
# 'apple'이라는 문자열 객체가 메모리 어딘가(주소: 4373983536)에 생성됨
# word는 그 객체를 가리키는 이름표

코드 분석

# 1단계
word = 'apple'
print(id(word))  # 4373983536
# 메모리에 'apple' 객체 생성, word가 이를 가리킴

# 2단계
word = word.replace("p", "q")
print(id(word))  # 4378922672 (주소 변경!)
# 'apple'은 불변 객체라서 수정 불가
# 'aqqle'이라는 새로운 객체 생성
# word가 새 객체를 가리키도록 재바인딩

# 3단계
word = 'apple'
print(id(word))  # 4373983536 (원래 주소로 복귀!)
# 파이썬이 이미 메모리에 있는 'apple' 객체를 재사용
# 이것이 "문자열 인터닝(String Interning)"

# 4단계
word = 'banana'
print(id(word))  # 4378922288 (다른 주소)
# 'banana'는 새로운 객체이므로 다른 주소

# 5단계
word = 'apple'
print(id(word))  # 4373983536 (다시 같은 주소!)
# 또다시 기존 'apple' 객체 재사용

중요한 특징들

1. 문자열은 불변(Immutable)이다

word = 'apple'
# word[0] = 'A'  # 에러 발생! 문자열은 수정 불가
word = 'Apple'   # 새로운 객체 생성 후 재바인딩만 가능

2. 문자열 인터닝 (String Interning) 파이썬은 같은 문자열을 여러 번 만들지 않고 재사용해요. 메모리 절약을 위해서죠.

a = 'apple'
b = 'apple'
print(id(a))  # 4373983536
print(id(b))  # 4373983536 (같은 주소!)
print(a is b)  # True (같은 객체를 가리킴)

3. 재바인딩(Rebinding) 변수에 새 값을 할당하면 다른 객체를 가리키게 돼요.

word = 'apple'   # word → 'apple' 객체
word = 'banana'  # word → 'banana' 객체 (다른 객체!)

시각적 이해

메모리 상황:

[주소: 4373983536]  'apple' ◄── word (1단계, 3단계, 5단계)
[주소: 4378922672]  'aqqle' ◄── word (2단계)
[주소: 4378922288]  'banana' ◄── word (4단계)

실습으로 확인하기

# 여러 변수가 같은 객체를 가리킬 수 있음
a = 'hello'
b = 'hello'
c = 'hello'
print(id(a), id(b), id(c))  # 모두 같은 주소!

# 리스트는 가변(mutable)이라서 다르게 동작
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(id(list1), id(list2))  # 다른 주소!

핵심 정리

  1. 변수 = 이름표: 변수는 객체를 가리키는 참조일 뿐
  2. 문자열 = 불변: 수정하면 새 객체 생성
  3. 인터닝: 같은 문자열은 재사용됨
  4. id(): 객체의 메모리 주소(정체성)를 반환

 

사이트를 어떻게 쉽게 만들 수 있을까 찾아보다가 framer를 알게 되었습니다.

튜토리얼 영상을 보니 어렵지 않게 따라 할 수 있을 것 같아 우선 이걸로 사이트를 만들어보기로 했습니다.

https://www.youtube.com/watch?v=a4u_8uYQ0_w&t=1816s

 

저는 이 영상을 보고 따라 해봤습니다.

설명이 상세하면서도 군더더기가 없어 좋습니다.

 


 

중간에 로고를 삽입하는 과정이 있어서 이왕 하는 거 로고까지 만들어봤습니다.

제가 직접 만들 능력은 없어서 챗지피티한테 만들어달라고 했고, 결과물을 이미지 편집 프로그램으로 수정했습니다.

 

ChatGPT한테 만들어달라고 한 로고. 세상 참 좋아졌네요.

 

 

배경을 지우고 png로 저장

 

편집 프로그램은 오랫동안 포토샵을 쓰다가 구독료에 비해 사용량이 너무 적은 것 같아 구독을 취소하고,

pixelmator pro로 갈아탔습니다.

어도비 제품군의 구독료가 취미로 즐기기엔 부담되는 수준이라 다른 대체 프로그램을 찾으시는 분들이 있는데,

이미지 편집에 관해 가장 많이 언급되는 것은 어피니티 포토와 픽셀메이터 프로입니다.

 

어피니티 포토는 보다 포토샵과 비슷하고 픽셀메이터 프로보다 더 고급 기능을 사용할 수 있는 반면

픽셀메이터 프로는 초보자가 사용하기에 더 쉽고,

특히 작년 애플의 인수로 익숙한 UI라던가 향후 지속적인 업데이트 및 기기 호환성의 측면에서 더 유리한 점이 있습니다.

 

저는 픽셀메이트 프로를 $ 49.99에 구매하였고 얼마간 사용해 본 결과 매우 만족합니다.

(그동안 어도비에 지불한 금액이 아깝더군요.)

저처럼 포토샵을 이미지 트리밍이나 색상보정, 잡티제거 정도로 사용하던 분들에겐 좋은 선택인 것 같습니다.

 


google font라는게 있는지도 처음 알았습니다.

오픈소스 폰트라 블로그나 웹사이트, 상업적 프로젝트도 자유롭게 사용이 가능하다고 하네요.

구글폰트 사이트의 화면

 

한글폰트를 다운받기 위해 필터에서 한글을 선택하려고 하는데 writing system과 language. 이렇게 두 개의 옵션이 보입니다.

둘의 차이는 다음과 같습니다.

 

  1. Writing system (쓰기 체계):
    • 이것은 글자를 표현하는 근본적인 문자 체계나 방식을 의미합니다.
    • 예를 들어, 라틴 문자(Roman script), 키릴 문자(Cyrillic script), 아랍 문자(Arabic script), 한글(Hangul), 한자(Han characters) 등이 이에 해당합니다.
    • 특정 언어를 모두 포함할 수 있는 더 넓은 범주라고 볼 수 있습니다.
  2. Language (언어):
    • 이것은 특정 언어를 의미하며, 해당 언어를 표기하는 데 사용되는 문자(Writing system)를 기반으로 합니다.
    • 예를 들어, Writing system이 '라틴 문자'라면, Language는 '영어(English)', '스페인어(Spanish)', '프랑스어(French)' 등이 될 수 있습니다.
    • 각 언어는 해당 언어 고유의 특수한 문자(예: 프랑스어의 'é', 독일어의 'ü')나 구두점 규칙을 포함할 수 있습니다.

 

한글은 다른 문자에서 파생된 것이 아니라 독자적으로 개발되었기 때문에 둘 중 어떤 것을 선택해도 상관없지만

일반적으로는 language 옵션에서 원하는 언어를 선택하면 됩니다.

 

 


 

강의 영상은 1시간 41분짜리인데 멈춰서 따라하고, 로고도 만들고, 이해가 안되는 부분을 몇 번 반복해서 봤더니

영상 40분을 보는데 4시간이 걸렸습니다.;;;

시간이 늦어서 오늘은 여기까지 해야겠네요.

'컴퓨터 학습노트' 카테고리의 다른 글

파이썬의 자료구조 (리스트)  (1) 2025.11.04
python의 기초  (0) 2025.11.03
사진 포트폴리오 사이트 만들기 -0  (0) 2025.10.27

저는 사진을 찍는 취미가 있습니다.

웹개발을 배우고 싶다는 생각을 한 것은 사진을 올릴 사이트를 제 손으로 만들고 싶었기 때문입니다.

 

사실 개인 사이트는 20년 전에(저는 현재 40대 초반입니다.) 만들어본 적이 있습니다.

드림위버와 제로보드로 만들었었고 주로 일기를 썼습니다.

그런데 시간이 지날수록 예전에 썼던 글은 낯 뜨거운 것이 되었고, 결국 감추듯이 사이트를 닫았습니다.

(그래도 썼던 것이 아까워 DB를 따로 저장해놨는데 컴퓨터를 몇 번 바꾸는 와중에 유실되었네요.)

블로그도 한동안 하다가 닫고, 이후로는 인스타를 몇 년째 하고 있습니다.

 

쓰고 지우는걸 반복하기 싫어 인스타엔 사진만 올렸는데 어느덧 게시물은 1000개를 육박하게 되었고,

이제 예전 사진을 보려면 끝도 없이 스크롤을 해야 하는 불편, 다들 잘 아실 겁니다.

인스타그램은 확실히 아카이브 용도로는 적합하지 않죠.

 

그래서 사진을 정리할 다른 공간을 마련해야겠다 생각했는데

네이버나 티스토리 같은 블로그를 이용할 수도 있지만

저는 좀 더 자유롭고 멋진 디자인을 원했습니다.

그래서 아-주 오랜만에 홈페이지를 만드는 방법을 알아보니 예전과는 많은 게 달라졌더군요.

이제는 웹개발이라고 불리며 개발에 필요한 기술 스택 로드맵이 무려....

 

 

이걸 모두 해야 할 필요는 없겠지만.....

 

물론 복잡한 기능이 필요 없는 개인 블로그 수준의 사이트는 클릭 몇 번으로 뚝딱 만들어지기도 합니다만

대AI시대에 개발을 배워두는게 나쁘지는 않겠다 싶은 생각도 들고,

또 뭐든 배우다 보면 욕심이 나는게 사람 마음 아니겠습니까.

 

어쨌든 저 로드맵을 순서대로 따라가기보다는

우선 쉽고 단순한 프로젝트를 완성시키고,

이후 좀 더 다양한 기능을 덧붙이며 필요한 지식을 섭렵하는 방향으로 나아가는 것이

취미로 배우는 저에겐 더 맞는 방식이 아닐까 싶습니다.

 

앞으로 이곳엔 공부한 내용과 개발 과정을 꾸준히 기록할 예정입니다.

 

+ Recent posts