C언어
배열
- 사용 이유
- 관련된 데이터 모음
- 변수 1개로 공간 여러개를 컨트롤 할 수 있다.
-- 배열은 스택 안에 해당 배열의 크기만큼 들어갈 수 있는 공간을 차지한다. - 자료형의 크기 * 배열의 수 만큼 공간을 차지한다
- int a[10] = 총 40byte(int a : 4byte * 10)
- 포인터
#include <stdio.h>
int main(void) {
int a9, a8, a7, a6, a5, a4, a3, a2, a1, a0;
a0 = -10;
a1 = 10;
a2 = 100;
a3 = 210;
a4 = 322210;
a5 = 1440;
a6 = 1130;
a7 = 33210;
a8 = 1210;
a9 = 33210;
int max_number = 0;
for (int i = 0; i < 10; i++) {
int num = *(&a0 + i); // pointer 사용하여 int num의 값을 가져온다.
if (num > max_number) {
max_number = num;
}
}
printf("최대값은 %d 입니다.\\n", max_number);
return 0;
}
- 배열 내 포인터
#include <stdio.h>
int main(void) {
int a[10]; // 40
a[0] = -10;
a[1] = 10;
a[2] = 100;
a[3] = 210;
a[4] = 310;
a[5] = 1440;
a[6] = 1130;
a[7] = 333210;
a[8] = 1210;
a[9] = 33210;
int max_number = 0;
for ( int i = 0; i < 10; i++ ) {
int current_num = *(a + i); // 배열 내 i만큼 이동
if ( current_num > max_number ) {
max_number = current_num;
}
}
printf("최대값은 %d 입니다.\\n", max_number);
return 0;
}
// 배열 내 다음 칸으로 이동하고 싶을 경우
// *(arr + i) 사용
#include <stdio.h>
int main() {
int arr[2];
*arr = 10;
*(arr + 1) = 20; // int arr의 다음칸으로 넘어간다.
printf("arr[0] : %d\\n", arr[0]);
printf("arr[1] : %d\\n", arr[1]);
return 0;
}
Java
- 자바의 변수 설정 후 초기화를 하지 않아 나오는 쓰레기 값은 출력되지 않는다.
int x;
System.out.println(x); // 출력되지 않음
int x = 10;
System.out.println(x); // 10 출력
- 클래스로 할 수 있는 것
- 객체 생성 // new 사람();
- 리모콘 생성 // new 사람();
- 리모콘 변수 생성 // 사람 a사람; - 메소드로 할 수 있는 2가지
- 객체를 만들 때 → 실제로 활용할 수 있는 기능 생성
- 리모콘을 만들 때 → 버튼을 만들 때 사용 - 상속
- 중복을 제거하기 위한 방법
→ 자바에서는 중복을 나쁘게 생각한다.
- A is B 관계 ( is == extends)
- 상속은 모든 자식 메소드를 만족시킬 수 없다.
class TDuck extends Duck {
- 상속 시 부모 / 자식 클래스로 구분한다.(자식은 부모클래스의 기능을 받아온다.)
class Duck {
void fly() {
System.out.println("오리 날다");
}
void swim() {
System.out.println("헤엄치는 중");
}
}
class TDuck extends Duck { // TDuck is Duck -> Duck 클래스(부모)의 fly와 swim 기능 사용 가능)
// void fly() {
// System.out.println("오리 날다");
// }
// Duck class를 상속하여 fly의 중복을 삭제
}
- 상속만으로 복잡한 중복을 해결할 수 없다
→ 구성을 배워야 한다.
- 다중 상속은 불가능
class TDuck extends Duck, RDuck { // 다중 상속(X) -> 누가 우선순위인지 모름
- 소프트웨어의 객체지향 기법, 좋은 설계기법, 디자인 패턴 등은 오직 중복 소스코드를 합리적으
로 없애기 위해서 존재한다.
💡 ❗중복이 안좋은 이유
- 나중에 변경사항이 생길 때, 변경해야 할 곳이 많아진다.
- 중복이 많은 코드는 쉬운코드이다.(1차원)
- 전체코드
class Duck {
void fly() {
System.out.println("오리 날다");
}
void swim() {
System.out.println("헤엄치는 중");
}
}
class TDuck extends Duck { // TDuck is Duck
// void fly() {
// System.out.println("오리 날다");
// }
// Duck class를 상속하여 fly의 중복을 삭제
}
//D2 요구
class WDuck extends Duck { // WDuck is Duck
// void fly() {
// System.out.println("오리 날다");
// }
// Duck class를 상속하여 fly의 중복을 삭제
}
// RDuck의 method는 총 3개(fly, swim, override fly)
class RDuck extends Duck { // 상속을 해도 fly라는 method는 따로 실행할 수 있다.
// method override : 상속받은 메소드를 다시 구현
void fly() {
System.out.println("나는 못난다");
}
// method override
void swim() {
System.out.println("물에 둥둥 뜸");
}
}
//
class RDuck2 extends RDuck { // 상속으로 override된 RDuck의 method 실행
// method override : 상속받은 메소드를 다시 구현
// void fly() {
// System.out.println("나는 못난다");
// {
}
class Main {
public static void main(String[] args) {
TDuck aduck = new TDuck();
WDuck bduck = new WDuck();
RDuck cduck = new RDuck();
RDuck2 dduck = new RDuck2();
aduck.fly();
bduck.fly();
cduck.fly();
dduck.fly();
}
}
여러 메소드 사용
public class Method {
public static void main(String[] args) {
Calculator cal = new Calculator();
// 계산기.더한결과를_화면에_출력(10, 20);
cal.sum(10, 20);
// 출력 => 결과 : 30
// 계산기.더한결과를_화면에_출력(50, 20);
cal.sum(50, 20);
// 출력 => 결과 : 70
// 계산기.뺀결과를_화면에_출력(50, 20);
cal.div(50, 20);
// 출력 => 결과 : 30
// 계산기.뺀결과를_화면에_출력(5, 2);
cal.div(5, 2);
// 출력 => 결과 : 3
//계산기.곱한결과를_화면에_출력(5, 2);
cal.mul(5, 2);
// 출력 => 결과 : 10
}
}
class Calculator {
void sum(int a, int b) { // 덧셈 메소드
System.out.println(a + b);
}
void div(int a, int b) { // 뺄셈 메소드
System.out.println(a - b);
}
void mul(int a, int b) { // 곱셈 메소드
System.out.println(a * b);
}
}
캐스팅
- 타입을 변환하는 것
- UpCasting : 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것
- DownCasting : 부모 클래스의 객체가 자식 클래스 타입으로 형변환 되는 것
class Main {
public static void main(String[] args) {
// Weapon 변수에는 Weapon 리모콘이 들어간다.
// Knife는 Weapon으로 형변환 (Knife 리모콘이 Weapon 리모콘으로 변환)
Weapon aweapon = new Knife(); // UpCasting
aweapon = new bow();
aweapon.attack();
}
}
class Weapon {
void attack() {
System.out.println("칼로 공격");
}
}
💡 해당 class에서의 메소드가 실행되지 않는 이유
- weapon이라는 객체 리모콘에는 attack이라는 버튼이 없다.
- knife라는 객체 리모콘에 attack이라는 버튼이 있다.
- aweapon은 weapon이라는 객체 리모콘을 가지고 있고, attack이라는 버튼을 사용할 수 없다.
- knife는 weapon의 버튼을 사용할 수 있는 것 뿐이지, weapon은 knife의 버튼을 사용할 수 없다
-> knife라는 객체는 weapon의 리모콘을 복제한 것 뿐이다.
- aweapon은 Weapon 리모콘만 가지고 있다.(Knife의 버튼이 아닌 Weapon의 버튼만 있다.)
-> UpCasting으로 인해 부모의 리모콘만 가지고 있다.
class Knife extends Weapon {
void attack() {
System.out.println("칼로 공격");
}
}
class bow extends Knife { }
후기 : 항상 파이썬만 해오던 나는 자바를 익히는데 조금 어려운 느낌이 든다. 2학년 때 배웠던 것을 지금 하려고 하니 굉장히 어려운데.. 왜이렇게 모르는게 많은지 모르겠다.. 미리 자바 시작해둘걸 후횐된다. 조금 더 열심히 해보자 재순
'멋쟁이 사자처럼 BE School' 카테고리의 다른 글
[멋쟁이사자처럼 Back-End School 1기] Day 13. 문자열, GC, JAVA, TDD (0) | 2022.07.04 |
---|---|
[멋쟁이사자처럼 Back-End School 1기] Day 12. C언어, Java (0) | 2022.06.30 |
[멋쟁이사자처럼 Back-End School 1기] Day 10. Git, GatsBy (0) | 2022.06.28 |
[멋쟁이사자처럼 Back-End School 1기] Day 9. 포인터, Git, GatsBy (0) | 2022.06.27 |
[멋쟁이사자처럼 Back-End School 1기] Day 8. 포인터, Git, Linux명령어, Java실습 (0) | 2022.06.24 |