프로그래밍 언어 활용
1. 기본 문법 활용
변수 활용
데이터 타입
프로그래밍 언어에서 여러 종류의 데이터를 식별하는 형태이다.
메모리 공간을 효율적으로 사용하고 2진수의 데이터를 다양한 형태로 사용할 수 있다.
기본 데이터 타입
- Boolean,
- Character
- String( 문자열, C=> char[] )
- Integer
- Floating Point(부동 소수점(Float=4byte, double=8byte))
기본 저장공간
- 변수(Variable) => 어떤 값을 주기억장치에 기억하기 위한 공간. 파이썬은 변수를 별도로 선언하지 않는다.
- 배열(Array) => 같은 타입의 변수로 이루어진 집합
- 포인터(Pointer) 변수의 주소 값을 저장하는 공간
배열 선언 시 초기값을 선언하지 않으면?
- Java => int형일 때 0, 실수형일 때 0.0, 문자열일 때 NULL이 저장된다.
- C/C++ => 쓰레기 값이 저장된다. 배열의 일부만 초기화한다면 남은 칸은 0으로 초기화된다.
C :: 문자열
문자열의 마지막에 항상 NULL이 붙는다. 0으로도 표현할 수 있으며 문자열의 끝을 나타낸다.
char형 포인터를 선언할 경우 첫 번째 문자의 주소 값이 저장된다.
char *p = "KOREA"; // char형 포인터 변수 p에 문자열의 처음인 "K"의 주소값을 저장
printf("%s", p); // p가 가리키는 문자열 출력 => "KOREA"
printf("%s", p+3); // p+3 자리부터 문자열 끝까지 출력한다. => "EA"
printf("%c", *p); // 한글자 출력. p가 들고있는 주소에 실제 들어있는 값 => "K"
printf("%c", *(p+3)); // 한글자 출력. P로부터 3칸 떨어진 자리
printf("%c", *p+2); // 한글자 출력. P가 들고있는 값 "K"에서 +2 => M (K,L,M,N,O,P...)
printf("%p", p); // 주소값 출력, P가 들고있는 주소 값 출력
printf("%c", (p+3)); // E
printf("%c", *p+3); // 한글자 출력. p가 들고있는 값 "K"에서 +3 => N (K,L,M,N,O...)
자료형
- Set (HashSet)
중복 값을 허용하지 않는 집합 형태의 자료형. 순서는 중요하지 않다. - Map (HashMap)
key-value쌍으로 구성된 객체를 저장하는 형태의 자료형 - ArrayList
List의 하위 클래스로 가변적 크기의 선형 리스트 형태의 자료형. 인덱스를 통한 접근이 가능하므로 순서가 중요하다. 중복 값 허용 - LinkedList
현재 노드가 이전 노드와 다음 노드의 상태를 알고 있는 자료형
Python
- Set => 중복 요소를 허용치 않는 집합 형태의 자료형
- List => 가변적 크기의 선형 리스트 자료형
- 튜플형 => 초기에 선언된 값을 생성, 삭제, 수정 불가능한 자료형
- 딕셔너리형 => 키와 값으로 구성된 객체를 저장하는 형태의 자료형(=map)
Java :: 다양한 자료형 사용 예시
// HashSet
HashSet nums = new HashSet();
nums.add(3);
nums.add(7);
nums.remove(3); // 3이라는 값을 찾아 제거
// HashMap (key-value)
Map nums = new HashMap();
nums.put("a", "소희");
nums.put("b", "현수");
nums.put("b", "뿡뿡이"); // 키 "b"에 덮어쓴다.
nums.remove("b"); // 키 "b"의 값 제거 (index아님 X)
System.out.println(nums.get("a")); // "소희"
// ArrayList (index)
List animals = new ArrayList();
animals.add("Dog");
animals.add("Cat");
animals.add(1,"Sheep"); // 1번째 index에 추가
animals.remove(2);
System.out.println(animals.get(1)) // 1번째 index 값 출력 =>"Sheep"
식별자(Identifier)
변수, 상수, 함수 등을 서로 구별하기 위해 사용하는 이름
식별자 표기법
- Camel Case
식별자 표기 시, 여러 단어가 이어지는 경우 첫 단어의 첫 글자만 소문자, 다음 단어의 첫 글자는 대문자로 표기한다. - Pascal Case
식별자 표기 시, 여러 단어가 이어지는 경우 각 단어의 첫 글자를 대문자로 표기한다. - Snake Case
식별자 표기 시, 여러 단어가 이어지는 경우 단어 사이에 언더바를 넣는다. - Hungarian Case
식별자 표기 시, 접두어에 자료형을 붙인다.
문자열=> sz, int=> n, char=> c
연산자
증감 연산자
피연산자를 1씩 증가, 혹은 1씩 감소시킬 때 사용하는 연산자. 파이썬은 지원하지 않는다.
| 형식 | 의미 |
| ++x | x를 먼저 1 증가시킨 후 그 값을 사용 |
| --x | x를 먼저 1 감소시킨 후 그 값을 사용 |
| x++ | x 값을 먼저 사용한 후 1증가 |
| x-- | x 값을 먼저 사용한 후 1감소 |
Java :: 증감 연산자 예시
int k = 10;
int a = 3;
switch(k++){ // 기존 k값인 case 10 이동 후 +1
case 10: a += 2; // break문이 없으므로
case 11: a *= k; // case 11도 실행.
case 8: break;
case 9: a %= 2;
}
System.out.println(a);
System.out.println(k)
// 만약 switch(++k) 였다면?
// => k가 먼저 11이 된 후 case 11로 이동한다.
int num = 3;
System.out.print(num++); // 3
System.out.print(num); // 4
int y = 3;
System.out.print(++y); // 4
System.out.print(y); // 4
표준 함수
출력 함수
Python :: print(), end''
print('Hello', end'') # 'Hello' 출력 후 개행 하지 않음.
print('Python') # 'Python' 출력 후 개행
print('Bye')
# HelloPython
# Bye
입력 함수
Python :: input(), 💡숫자를 입력받을 땐 문자열로 저장 후 숫자로 변환한다. => eval()
ss input() # ss에 값을 입력받는다. (문자로 저장)
ss eval(ss) # 숫자로 변환(=>숫자 변환 불가능한 문자라면 에러)
print(ss)
# 입력 Hello => error
# 입력 54321 => 54321
명령문
조건문
- switch => 여러 케이스 중 하나를 선택한다.(파이썬은 없음)
- if => 조건의 참, 거짓 여부에 따라 실행 경로를 선택한다.
반복문
- while => 조건이 참일동안 while 문 내의 문장을 반복 실행한다.
- for
Python :: for문 사용방법
i =0
sum = 0
for i in range (1, 11): # i는 1부터 10까지 반복
sum = sum+i
print(sum) #55
---
for num in range (10) # i는 0부터 9까지 1씩 증가
루프 제어 명령어
무한 루프를 방지하기 위한 명령어
Java, C++, C, 파이썬 모두에서 break, continue를 사용한다.
- break
반복문을 중지하고 빠져나간다. 주로 switch문을 종료시키는 역할을 한다.
break를 이용해 종료시키지 않으면 다른 case문도 조건을 무시하고 실행시킨다. - continue
다음 반복문으로 넘어간다.
무한루프(Infinite Loop)란?
프로그램이 끝없이 동작하는 것으로, 반복문에 종료 조건이 없거나 종료 조건을 만날 수 없는 경우 발생한다.
클래스
객체지향 프로그래밍에서 특정 객체를 만들기 위한 틀이다. 내부에 변수와 메서드를 정의한다.
C언어는 명령형 언어이므로 클래스를 지원하지 않는다.
접근 제어자(Access Modifier)
특정 클래스나 변수, 메서드를 외부에서 접근할 수 있도록 권한을 설정하는 것이다.
- public => 외부의 모든 클래스에서 접근 가능
- protected => 동일 패키지 혹은 상속받은 하위 클래스에서만 접근 가능
- default => 접근 제어자를 설정하지 않은 경우로 동일 패키지 내부에서만 접근 가능
- private => 같은 클래스 내에서만 접근 가능
생성자(Constructor)
클래스의 객체를 생성할 때 자동으로 호출되는 메서드로 반환 값이 없다.
클래스를 사용하기 위해 멤버 변수를 초기화하거나, 설정이 필요한 경우 사용한다.
Python :: 생성자 정의 __init__
class Test:
def __init__(self, num):
num = num
소멸자(Destructor)
객체의 수명이 끝났을 때 객체를 제거하기 위해 사용하는 메서드로 반환 값이 없다.
상속(Inheritance)
어떤 객체의 변수와 메서드를 다른 객체가 물려받는 기능이다.
Overlaoding
- 동일한 이름의 메서드를 매개 변수만 다르게 여러 개 만드는 것. (파이썬은 X)
- 메서드의 이름이 같아야 한다.
- 파라미터의 개수가 달라야 한다.
- 파라미터의 개수가 같은 경우 데이터 타입이 달라야 한다.
- 리턴 값은 같거나 달라도 된다.
Overriding(모두 같아야 한다.)
- 어떤 클래스를 상속받은 하위 클래스가 상위 클래스의 메서드를 재정의 하는 것
- 오버라이드 하려는 메서드가 상위 클래스에 존재하여야 한다.
- 메서드 이름이 같아야 한다.
- 메서드의 파라미터 개수와 데이터 타입이 같아야 한다.
- 리턴 값이 같아야 한다.
💡 C++ :: 상하위 메서드 둘 중 한 곳에 virtual 키워드를 붙여야 한다.
없다면 오버라이딩되지 않아 상위 클래스의 메서드가 호출된다.
class Mom {
public:
virtual void fn() {
cout << "Mom 호출" << endl;
}
};
class Son : public Mom {
public:
void fn() {
cout << "Son 호출" << endl;
}
};
void main(){
Mom son = new Son();
son->fn(); // son에 overriding된 fn() 호출
delete son;
}
// "Son 호출"
// fn()중 한곳이라도 virtual이 없다면 오버라이딩 되지 않으므로 상위클래스인 Mom.fn()이 호출
추상 클래스
미구현된 추상 메서드를 가진 클래스
해당 클래스를 상속받은 자식 클래스는 추상 메서드를 반드시 구현해야 한다.
인터페이스
자바의 다형성을 이용해 유지보수성을 높이기 위한 문법이다.
일종의 추상 클래스로 추상 메서드와, 상수를 가진다.
Java :: 추상 클래스, 인터페이스 예시
// 추상 클래스
// ✨ 클래스와 메서드에 abstract 추가
abstract class Run {
abstract void startRun(); // 추상메서드 선언
}
class Walk extends Run {
void startRun() { // 추상메서드 구현
System.out.println("start Run!!");
}
}
// 인터페이스
interface Coffee {
void roasting(); // 추상 메서드 (abstract이 붙지않음)
}
class BrewCoffee implements Coffee {
void roasting(){
System.out.println("Roasting...");
}
class CoffeeTest {
public static void main(String args[]){
Coffee coffee = new BrewCoffe();
coffee.roasting();
}
}
}
// 🎈 인터페이스를 상속할 땐 implements, 일반 클래스를 상속할 땐 extends