배열

 

// 배열
int[] array1 = new int[5];       // 크기가 5인 int형 배열 선언
string[] array2 = new string[3]; // 크기가 3인 string형 배열 선언
int num = 0;

array1[0] = 1; // 배열 초기화 - 보통 for문 등 반복문 사용
array1[1] = 2;
array1[2] = 3;
array1[3] = 4;
array1[4] = 5;

// 배열 예제
num = array1[0];

int[] itemPrices = { 100, 200, 300, 400, 500 };
int totalPrice = 0;

for (int i = 0; i < itemPrices.Length; i++)
{
    totalPrice += itemPrices[i];
}

Console.WriteLine("총 아이템 가격: " + totalPrice + " gold");

 

배열 예제

// 게임캐릭터 능력치 만들기
int[] playerStats = new int[4]; // 플레이어의 공격력, 방어력, 체력, 스피드를 저장할 배열

Random rand = new Random(); // 능력치를 랜덤으로 생성하여 배열에 저장
for (int i = 0; i < playerStats.Length; i++)
{
    playerStats[i] = rand.Next(1, 11);
}

Console.WriteLine("플레이어의 공격력: " + playerStats[0]);
Console.WriteLine("플레이어의 방어력: " + playerStats[1]);
Console.WriteLine("플레이어의 체력: " + playerStats[2]);
Console.WriteLine("플레이어의 스피드: " + playerStats[3]);
// 학생들의 성적 평균 구하기
int[] scores = new int[5];  // 5명의 학생 성적을 저장할 배열

for (int i = 0; i < scores.Length; i++) // 성적 입력 받기
{
    Console.Write("학생 " + (i + 1) + "의 성적을 입력하세요: ");
    scores[i] = int.Parse(Console.ReadLine());
}

int sum = 0; // 성적 총합 계산
for (int i = 0; i < scores.Length; i++)
{
    sum += scores[i];
}

double average = (double)sum / scores.Length;
Console.WriteLine("성적 평균은 " + average + "입니다."); // 성적 평균 출력
// 배열을 활용한 숫자 맞추기 게임
Random random = new Random();  // 랜덤 객체 생성
int[] numbers = new int[3];  // 3개의 숫자를 저장할 배열

for (int i = 0; i < numbers.Length; i++) // 3개의 랜덤 숫자 생성하여 배열에 저장
{
    numbers[i] = random.Next(1, 10);
}

int attempt = 0;  // 시도 횟수 초기화
while (true)
{
    Console.Write("3개의 숫자를 입력하세요 (1~9): ");
    int[] guesses = new int[3];  // 사용자가 입력한 숫자를 저장할 배열

    for (int i = 0;i < guesses.Length; i++)
    {
        guesses[i] = int.Parse(Console.ReadLine());
    }

    int correct = 0; // 맞춘 숫자의 개수 초기화

    for (int i = 0; i < numbers.Length; i++) // 숫자 비교 및 맞춘 개수 계산

    {
        for (int j = 0; j < guesses.Length; j++)
        {
            if (numbers[i] == guesses[j])
            {
                correct++;
                break;
            }
        }
    }

    attempt++;  // 시도 횟수 증가
    Console.WriteLine("시도 #" + attempt + ": " + correct + "개의 숫자를 맞추셨습니다.");

    // 모든 숫자를 맞춘 경우 게임 종료
    if (correct == 3)
    {
        Console.WriteLine("축하합니다! 모든 숫자를 맞추셨습니다.");
        break;
    }
}

 

다차원 배열

  • 여러 개의 배열을 하나로 묶어 놓은 배열
  • 행과 열로 이루어진 표 형태와 같은 구조
  • 2차원, 3차원 등의 형태의 배열을 의미
  • C#에서는 다차원 배열을 선언할 때 각 차원의 크기를 지정하여 생성한다.
// 2차원 배열의 선언과 초기화
int[,] array3 = new int[2, 3];  // 2행 3열의 int형 2차원 배열 선언

// 다차원 배열 초기화
array3[0, 0] = 1;
array3[0, 1] = 2;
array3[0, 2] = 3;
array3[1, 0] = 4;
array3[1, 1] = 5;
array3[1, 2] = 6;

// 선언과 함께 초기화
int[,] array2D = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };

 

3차원 이상은 잘 사용하지 않는다.

// 3차원 배열의 선언과 초기화
int[,,] array3D = new int[2, 3, 4] 
{
    { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } },
    { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }
};

 

다차원 배열 예제

int[,] map = new int[5, 5];
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        map[i, j] = i + j;
    }
}

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        Console.Write(map[i, j] + " ");
    }
    Console.WriteLine();
}
  • 다차원 배열을 활용하면 복잡한 데이터 구조를 효율적으로 관리할 수 있다.
  • 2차원 배열은 행과 열로 이루어진 데이터 구조를 다루기에 적합하다.
  • 3차원 배열은 면, 행, 열로 이루어진 데이터 구조를 다루기에 적합하다.
// 게임 맵 구현
int[,] map = new int[5, 5] 
{ 
    { 1, 1, 1, 1, 1 }, 
    { 1, 0, 0, 0, 1 }, 
    { 1, 0, 1, 0, 1 }, 
    { 1, 0, 0, 0, 1 }, 
    { 1, 1, 1, 1, 1 } 
};

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        if (map[i, j] == 1)
        {
            Console.Write("■ ");
        }
        else
        {
            Console.Write("□ ");
        }
    }
    Console.WriteLine();
}

 

 

컬렉션

자료를 모아놓은 데이터 구조

  • 컬렉션은 배열과 비슷한 자료 구조
  • 배열과는 다르게 크기가 가변적
  • C#에서는 다양한 종류의 컬렉션을 제공
  • 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가

 

List(리스트)

동적 배열. List를 생성할 때 담을 자료형을 지정해야한다.

List<int> numbers = new List<int>(); // 빈 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 리스트에서 데이터 삭제

for (int i = 0; i < numbers.Count; i++) // 리스트 데이터 출력 - for문
{
    Console.WriteLine(numbers[i]);
}

foreach (int number in numbers) // 리스트 데이터 출력 - foreach문
{
    Console.WriteLine(number);
}

 

Dictionary(딕셔너리)

키와 값으로 구성된 데이터 저장. 중복된 키를 가질 수 없고, 키와 값의 쌍을 이룬다.

Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제

foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
    Console.WriteLine(pair.Key + ": " + pair.Value);
}

 

Stack

후입선출(LIFO) 구조를 가진 자료 구조

Stack<int> stack1 = new Stack<int>();  // int형 Stack 선언

stack1.Push(1); // Stack에 요소 추가
stack1.Push(2);
stack1.Push(3);

int value = stack1.Pop(); // Stack에서 요소 가져오기

 

Queue

선입선출(FIFO) 구조를 가진 자료 구조

Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언

queue1.Enqueue(1); // Queue에 요소 추가
queue1.Enqueue(2);
queue1.Enqueue(3);

int value = queue1.Dequeue(); // Queue에서 요소 가져오기

 

HashSet

중복되지 않은 요소들로 이루어진 집합

HashSet<int> set1 = new HashSet<int>();  // int형 HashSet 선언

set1.Add(1); // HashSet에 요소 추가
set1.Add(2);
set1.Add(3);

foreach (int element in set1) // HashSet에서 요소 가져오기
{
    Console.WriteLine(element);
}

 

 

리스트(lists)

리스트의 정의 및 선언

mbti = ['INFP', 'ENFP', 'ISTJ', 'ESTP']
print(mbti)
print(mbti[0])

 

파이썬에서 리스트는 타입을 통일하지 않아도 된다.

my_list = [123, 'apple']
print(my_list)

그러나 for 문이나 while 문 등에서 혼란을 야기할 수 있기 때문에 되도록 통일해주는 것이 좋다.

 

리스트 데이터 접근 및 조작

제거하는 함수의 종류는 비교적 많은 편이다.

colors = ['red', 'blue', 'green']

# 수정
colors[2] = 'black'
print(colors)

# 추가
colors.append('purple')
print(colors)

# 추가 2
colors.insert(1, 'yellow')
print(colors)

# 제거 1
del colors[0]
print(colors)

# 제거 2
color = colors.pop(0) # 인덱스 값을 넣지 않으면 끝부터 삭제
print(colors)
print(color)

# 제거 3
colors.remove('blue')
print(colors)

del 함수는 제거와 동시에 더이상 그 값을 사용할 수 없지만 pop() 함수는 제거한 값을 반환하여 다시 사용할 수 있다.

 

리스트 정렬

sort() 함수는 리스트를 오름차순으로 반환하며 reverse = True를 넣으면 내림차순으로 반환한다.

colors = ['blue', 'red', 'gray', 'black', 'yellow', 'orange']

# 정렬 1
colors.sort()
print(colors)

colors.sort(reverse = True)
print(colors)

# 정렬
print(sorted(colors))

 sort() 함수는 리스트를 오름차/내림차순으로 반환하지만 sorted() 함수는 리스트 자체를 정렬시킨다.

 

len() 함수는 리스트의 값의 개수를 반환한다.

print(len(colors))

 

인덱스 번호를 -1로 하면 리스트의 마지막 값을 반환한다.

print(colors[-1])

값이 존재하지 않는 인덱스 번호를 넣지 않도록 주의한다.

 

리스트 슬라이싱 및 복사

원하는 범위만큼 리스트의 범위를 취할 수 있는 방법

colors = ['blue', 'red', 'gray', 'black', 'yellow', 'orange']

print(colors[1:5])
print(colors[:4])
print(colors[2:])
print(colors[-5:])

 

새로운 리스트에 기존의 리스트를 반환 받아 사용할 수 있다.

colors = ['blue', 'red', 'gray', 'black', 'yellow', 'orange']
# colors_2 = colors
colors_2 = colors[:]

colors_2.pop()

print(colors)
print(colors_2)

기존 리스트가 변형될 수 있기 때문에 변수를 직접 가져와서 쓰지 않는 것이 좋다.

 

리스트와 흐름 제어

조건문과 반복문을 통한 리스트의 활용

scores = [88, 100, 96, 43, 65, 78]
scores.sort(reverse=True)

for score in scores:
    if score >= 80:
        print(score)
    else:
        print("Fail")

 

리스트 최댓값/최솟값/총합/평균

scores = [88, 100, 96, 43, 65, 78]

max_val = max(scores) # 최댓값
min_val = min(scores) # 최솟값
sum_val = sum(scores) # 총합
avg_val = sum(scores) / len(scores) # 평균

 

 

튜플(tuples)

튜플의 정의 및 특징

튜플은 전체를 새로 할당할 수는 있지만 요소의 값을 변경할 수 없다.

tup = (1, 20, 40)
print(tup[0])

#tup[0] = 100
tup = (100, 30, 4)
print(tup)

 

튜플/리스트 변환

tup = (1, 20, 40)

# 리스트 변환 1
list_1 = list(tup)
print(list_1)

# 리스트 변환 2
list_2 = [x for x in tup]
print(list_2)

# 리스트 변환 3
list_3 = []

for x in tup:
    list_3.append(x)
    
print(list_3)

 

 

딕셔너리

딕셔너리 정의 및 선언

딕셔너리는 키-값이 한 쌍이다.

student = {
    "student_no" : "202301234",
    "major" : "English",
    "grade" : 1
}

print(student["student_no"])

 

또한 키 값을 재할당 할 수 있다.

student = {
    "student_no" : "202301234",
    "major" : "English",
    "grade" : 1
}

student["student_no"] = "202301235"

print(student)
print(student["student_no"])

 

딕셔너리 데이터 조작

student = {
    "student_no" : "202301234",
    "major" : "English",
    "grade" : 1
}

# 추가
student["gpa"] = 4.5
print(student)

# 수정
student["gpa"] = 4.3
print(student)

# 삭제
del student["grade"]
print(student)

 

딕셔너리 함수

student = {
    "student_no" : "202301234",
    "major" : "English",
    "grade" : 1
}

# 데이터 접근
print(student.get("major"))
print(student.get("gpa", "해당 키-값 쌍이 없습니다."))

# 딕셔너리의 키를 반환
print(student.keys())

# 딕셔너리의 값을 반환
print(student.values())

키-값을 반환하는 함수를 리스트로 형변환하여 사용할 수 있다.

student = {
    "student_no" : "202301234",
    "major" : "English",
    "grade" : 1
}

print(list(student.keys()))
print(list(student.values()))

 

딕셔너리와 반복문

tech = {
    "HTML" : "Abvanced",
    "JavaScript" : "Intermediate",
    "Python" : "Expert",
    "Go" : "Novice"
}

for key in tech.keys():
    print(key)

for value in tech.values():
    print(value)

for key, value in tech.items():
    print(f'{key} - {value}')

 

중첩

# 중첩(Nesting)

student_1 = {
    "student_no" : "1",
    "gpa" : "4.3"
}

student_2 = {
    "student_no" : "2",
    "gpa" : "3.8"
}

students = [student_1, student_2]

for student in students:
    print(student['student_no']) # 공통되는 값

for student in students:
    student['graduated'] = False
    print(student) # 졸업여부 추가

 

하나의 키에 리스트로 여러 개의 값을 할당할 수 있다.

student = {
    "subjects" : ["회계원리", "중국어회화"]
}

print(student["subjects"])

subjects_list = student["subjects"]

for subject in subjects_list:
    print(subject)

 

딕셔너리 또한 값을 할당할 수 있다.

student = {
    "scholarship" : {
        "name" : "국가장학금",
        "amount" : "1000000"
    }
}

print(student)

for key in student.keys():
    print(key)

for value in student.values():
    for value_2 in value.values():
        print(value_2)

 

 

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

회원가입 프로그램 실습 - 파이썬(Python) 편  (0) 2023.08.08
함수  (0) 2023.08.07
조건문과 반복문  (0) 2023.07.20
변수와 자료형  (0) 2023.07.19
파이썬 for Beginner 3판 14장 연습문제 답(더보기 클릭)  (0) 2023.07.13
배열(Arrays)

어떤 특정한 자료형에 대해 그 자료형을 모아놓은 자료구조

 int[] price = {10000, 9000, 40000, 7000};
String[] mbti = {"INFP", "ENFP", "ISTJ", "ESTP"};

System.out.println(price[0]); // 10000
System.out.println(mbti[0]); // INFP

대괄호 [ ] 앞의 int나 String은 뒤에 올 변수에 들어가는 자료형을 지정해준다. 변수를 선언할 때 작성했던 타입의 자료열로만 구성된 배열을 선언한다. 변수에 들어있는 값을 꺼내고 싶다면 호출하고 싶은 값의 인덱스를 대괄호에 넣어준다.

배열 인덱스의 값을 임의의 값을 수정하는 방법은 간단하다.

price[1] = 8000
System.out.println(price[1]); // 8000

값을 가져온 뒤, 대입 연산자를 통해 값을 새롭게 대입하면 기존의 값에 덮어씌워진다.

배열을 확인하고 싶다고 아래처럼 직접 배열의 변수를 함수에 전달하면 아마 이상한 값이 나올 것이다.

System.out.println(price);

변수 역시 객체이기 때문에 값 자체를 드러내지 않고 주소값이 나온다.

 

for 반복문을 통한 배열의 조작

 int[] price = {10000, 9000, 40000, 7000};
String[] mbti = {"INFP", "ENFP", "ISTJ", "ESTP"};

for (int i = 0; i < mbti.length; i++) {
    System.out.println(mbti[i]);
}

for 문에 초기화식, 조건식, 증감식을 써준다. length 함수는 배열의 크기를 구해준다. 결과를 출력하려면 배열의 이름과 변수를 써주면 된다.

 

 

리스트(Lists)

순서를 구분하고 중복을 허용하는 자료구조

리스트의 종류에는 Vector, ArrayList, LinkedList가 있다. 그 중 가장 대중적으로 많이 쓰이는 ArrayList에 대해 알아보자.

ArrayList는 배열보다 폭넓은 메서드, 각종 확장된 기능을 제공한다.

ArrayList list = new ArrayList(10);
list.add(100);
	list.add("INFP");

for (int i = 0; i < list.size(); i++) {
	System.out.println(list.get(i));
}

ArrayList라는 객체 자료형을 선언한 뒤, 변수와 new 연산자를 사용하여 인자로 길이를 정해준다. add 메서드는 타입을 지정하지 않아도 리스트에 추가할 수 있다.  데이터 타입을 제한하고 싶다면 ArrayList 뒤에 꺽쇠< >에 제한하고 싶은 자료형의 객체타입(Integer, String 등)을 쓰면 된다. 자료형을 제한할 때는 기본형 데이터(int 등)를 쓸 수 없다.

 

 

맵(Map)

키-값 쌍을 요소로 가지는 데이터의 모음

맵은 순서를 구분하지 않는다. 키는 중복이 불가능하고, 값은 중복이 가능하다.

맵에도 여러가지 종류가 있지만 가장 많이 쓰이는 HashMap에 대해 알아보자.

HashMap<String, String> map = new HashMap();
map.put("age", "30");
map.put("mbti", "INFP");

System.out.println(map.get("age"));

HashMap은 선언한 뒤, 인자를 넣지 않아도 된다. put 메서드로 키-값을 넣는다.

결과를 출력할 때는 리스트와 똑같이 get 메서드를 사용하는데 인덱스 값이 아닌 키를 넣어야 그에 대응되는 값을 출력한다. 데이터 타입을 제한하고 싶다면 리스트와 마찬가지로 꺽쇠를 이용하여 객체타입을 지정해주면 된다.

 

 

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

회원가입 프로그램 실습 - 자바(Java) 편  (1) 2023.05.16
함수  (0) 2023.05.15
제어문 - 조건문과 반복문  (0) 2023.05.11
연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09

+ Recent posts