📍 Sprint 3 FE Typescript
인터프리터 언어인 자바스크립트와는 달리 타입스크립트는 컴파일 언어이다. 이러한 이유로 타입스크립트를 학습 전 C언어로 중요 개념을 학습하는 한 주!
int a = 10;
int b = 20;
// 1)
int a = 20;
// 2)
int b = 30 ;
// 0x100 --- 10
// 0x101 --- 20
// 1) 재할당 하면 20을 저장하는 주소 값으로 교체
// 0x100 ↘️ 10
// 0x101 --- 20
// 2) 기존에 없는 값은 새로운 메모리를 확보하여 저장하고 b가 가르키는 주소값 대체
// 0x100 -x-> 10
// 0x101 ↘️ 20
// 0x110 30
scanf("서식 문자열", &변수);
if( 수행 조건 ){
수행하고 싶은 일
}
if( 수행 조건 ){
수행 조건 만족 시 수행
}else{
수행 조건 불만족 시 수행
}
if( 수행 조건 1 ){
수행 조건 만족 시 수행
}else if( 수행 조건 2 ){
수행 조건 만족 시 수행
}{
수행 조건 1, 2 불만족 시 수행
}
while( 반복 조건 ) {
반복 문장
}
while( 조건 1 ){
while( 조건 2 ){
....
}
}
for(초기문; 조건문; 증감문){
반복하고자 하는 내용
}
while(1){
if(a=b) break; // a와 b가 같으면 while문을 빠져나감
}
while(1){
if(a=b) continue; // a와 b가 같으면 아래의 ... 내용을 무시하고 다시 while문 시작으로 돌아감
...
}
자료형 함수이름 (인수 목록){
함수의 내용
}
결과값을 리턴하지 않는 함수
void print(){ // 리턴할 값이 없는 함수 e.g. 출력만 하는 함수
printf("출력")
}
void func(){
static int val = 0; // static으로 선언하지 않으면 매번 초기화
val++;
printf("%d\n", val);
}
int main(){
int i = 0;
while(i < 3){
func();
i++;
}
}
// 1
// 2
// 3
int a[100];
int arr[5];
// 배열의 타입, 배열 이름, 배열 길이
int arr[5] = {1, 2, 3, 4, 5};
// 배열의 초기화
char str[12] = "Hello World";
int *pA
앞에 * 기호를 붙여 사용int *pA = &a;
주소 값만 저장하므로 일반 변수에 저장할 수 없음int main(){
int a = 5;
int *pA = &a;
printf("%p\n", &a); // b의 주소값 출력
printf("%p\n", pA); // b의 주소값 출력
printf("%d\n", *pA); // PA가 가르키고 있는 값 출력 = 5
}
int a = 1;
int b = a;
// 값을 전달
// a와 b 둘 다 값이 존재
void func(int *pArr){
...
}
int main(){
int arr[] = {1, 2, 3};
func(arr); // 주소값을 전달
}
// 배열의 주소값을 포인터로 넘겨서 참조 사용 가능
int (*func)(int a);
// 자료형 (*함수 포인터 이름)(인자 목록)
int Plus(int a, intb){
return a -b;
}
int main(){
int a = 10;
int b = 5;
int (*fptr)(int a, int b);
fPtr = Plus; // 함수의 주소값을 넘김
int result = fPtr(a,b); // 포인터가 간접 호출
printf("%d\n", result);
return 0;
}
이름, 나이 성별
struct student{ // 내가 정의한 구조체 student라는 새로운 데이터 타입
char name[10];
int age;
int height;
}
st1.name, st1.age, ...
// [구조체 변수명].[구조체 멤버]
// 멤버 접근 시 사용하는 .을 직접 접근이라고 함
struct student{
int age;
int height;
} st1;
int main(){
st1.age = 10;
st1.height = 130;
}
union student{ // 내가 정의한 구조체 student라는 새로운 데이터 타입
char name[10];
int age;
int height;
};
enum Week{ // 내가 정의한 구조체 student라는 새로운 데이터 타입
sun = 0, // 첫 번째를 0으로 설정하면 이후 멤버들은 1씩 증가
mon,
tue,
...
};
// 일반 변수 선언 -> 정적
int a;
int user[30];
void* malloc(size_t size); // 동적 메모리 할당 함수의 원형
// void* 타입이 지정되지 않은 포인터
int main(){
int num;
int *student;
printf("학생의 수를 입력하세요.");
scanf("%d", &num);
student = (int*)malloc(sizeof(int) * num);
printf("할당된 메모리 크기 : %d", sizeof(int)*num);
free(student); // 사용한 메모리 해제 -> 해제 안하면 메모리 누수
}
(출처) https://pridiot.tistory.com/244
클래스 = 데이터 + 메소드
→ 사용자 정의 타입class 클래스 이름{ // 클래스 선언
접근 지정자 클래스 이름 () { } // 생성자
접근 지정자 ~클래스 이름 () { } // 소멸자
접근 지정자 데이터형 멤버 변수(필드); // 변수 선언
접근 지정자 데이터형 메소드() { }; // 메소드 선언
}
접근 지정자 | 의미 |
---|---|
public | 누구나 접근 가능 |
protected | 상속 관계에 있을 때 상속 받은 자식 클래스에서만 접근 가능 |
private | 나의 클래스 내부에서만 접근 가능, 외부에서는 절대 접근 불가능 |
Dog a = new Dog(); // 객체 a (원래는 주소를 가지고 있는 포인터 변수)
class Dog{
private int eyes, nose, mouse, ears; // 다른 곳에서 접근 할 수 없게 캡슐화
public void bark(){Console.WriteLine("멍멍");}
}
class HelloWorld{
static void Main(){
Dog a = new Dog();
a.bark();
}
}
class Dog{
private int eyes, nose, mouse, ears; // 다른 곳에서 접근 할 수 없게 캡슐화
public void bark(){Console.WriteLine("멍멍");}
public Dog(){
eyes = 0;
nose = 0;
mouse = 0;
ears = 0;
}
}
class Dog{
protected int eyes, nose, mouse, ears; // 자식들이 사용할 수 있게 protected
public void bark(){Console.WriteLine("멍멍");}
public Dog(){
eyes = 0;
nose = 0;
mouse = 0;
ears = 0;
}
}
class Poodle : Dog{
public Poodle(){
base.eyes = 1;
Console.WriteLine("Poodle eyes : {0}", eyes);
}
}
class Hello{
static void Main(){
Dog a = new Dog();
a.bark();
Poodle pd = new Poodle();
}
}
int Plus(int a, int b){ }
int Plus(int a, int b, int c){ }
char Plus(char a, char b){ }
int Plus(double a, double b){ }
class Dog{
protected int eyes, nose, mouse, ears; // 자식들이 사용할 수 있게 protected
virtual public void bark(){Console.WriteLine("멍멍");}
public Dog(){
eyes = 0;
nose = 0;
mouse = 0;
ears = 0;
}
}
class Poodle : Dog{
public Poodle(){
base.eyes = 1;
}
public override void bark(){Console.WriteLine("왈왈");} // 오버라이딩
}
class Jindo : Dog{
public Poodle(){
base.eyes = 1;
}
public override void bark(){Console.WriteLine("컹컹");} // 오버라이딩
}
class Hello{
static void Main(){
Dog a = new Dog();
a.bark(); // 멍멍
Poodle pd = new Poodle();
pd.bark(); // 왈왈
dog = new Jindo();
dog.bark(); // 컹컹
}
}
접근 지정자 interface 이름 : 기반 인터페이스(필수x){} // 인터페이스 선언 형태
접근 지정자 class 자식 클래스 이름 : 인터페이스{} // 인터페이스를 상속받는 클래스 형태
기존의 기능을 추가하거나 수정의 개념보다 동일한 개념의 기능을 새롭게 구현하는 기능
공동 작업 시 표준을 정하는 역할 (설계의 역할)
추상 클래스 상속 → 기능 확장 목적
인터페이스 상속 → 기능 명세(목록만 만듦)
public interface Feature{
void Afeat();
void Bfeat();
}
public class First : Feature{
public void Afeat(){Console.WriteLine("첫번째 기능 A");}
public void Bfeat(){Console.WriteLine("첫번째 기능 B");}
}
public class Second : Feature{
public void Afeat(){Console.WriteLine("두번째 기능 A");}
public void Bfeat(){Console.WriteLine("두번째 기능 B");}
}
class Hello{
static void Main(){
First f = new First();
f.Afeat(); // 첫번째 기능 A
f.Bfeat(); // 첫번째 기능 B
Second s = new Second();
s.Afeat(); // 두번째 기능 A
s.Bfeat(); // 두번째 기능 B
}
}
(인수) => 표현식 또는 명령문
Delegate(int x, int y) {return x+y;}
(x, y) => x+y; // 람다식 표현