본문 바로가기

[자바] 다형성 (Polymorphism) ※ 다형성 다형성이란 '여러 가지 형태를 가질 수 있는 능력'으로써 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함. ex) class Parent{ int num1; int num2; void parnetMethod(){ ... } } class Child{ String str; void childMethod(){ ... } } public static void main(String[] args){ Parent p = new Child(); //이런 형태가 가능하다. Child c = new Child(); } 위에서 보다시피 Parent p = new Child()와 같.. 더보기
[자바] 제어자(Modifier) ※ 제어자란? 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다. ※ static '클래스의' 또는 '공통적인'의 의미를 담고있다. 멤버변수, 메서드, 초기화 블럭에 사용 가능하다. 멤버변수에서 사용될 때 - 클래스 안에서 맴버변수에 사용되면 클래스 변수로써 인스턴스와 상관없이 같은 값을 갖게 된다. 메서드에서 사용될 때 - 메서드에서 사용되면 인스턴스를 생성하지 않고도 호출이 가능한 메서드가 된다. 이 static메서드 내에는 인스턴스멤버들을 직접 사용할 수 없다. 인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static을 붙여서 static메서드로 선언하는 것을 고려해 보도록 하자. 가능하.. 더보기
[자바] 상속 ※ 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것 ※ 상속방법 class Child extends Parent{ ... } ※ 상속의 특징 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다. 자손 클래스의 개수는 조상 클래스보다 항상 같거나 많다. 자손 클래스는 부모클래스의 기능 및 변수 + 자손 클래스의 기능 및 변수 이므로 부모클래스를 포함하는 범위에 속한다. ※ 상속 예시 public class Animal { int age; public Animal(){ this(7); } public Animal(int age){ this.age = age; } public void eat(){ System.out.println("[Animal 클래스] 먹는다. 냠냠"); } } publ.. 더보기
[자바] 오버로딩 / 오버라이딩 ※ 오버로딩이란? 메서드 이름이 같더라도 매개변수에 따라 하나의 메서드 이름으로 여러 기능을 구현할 수 있는 기능이다. ex) void println() void println(boolean x) void println(char x) void println(int x) void println(String x) .... 위와 같이 메서드들이 같은 이름을 갖고 있지만 매개변수가 다르다. 이 메서드만큼 새로운 이름을 지으려면 이름을 짓기도 어렵고 사용하는 사람도 기억하기 부담스럽다. 하지만 오버로딩을 통해 하나의 메서드 이름으로 정의될 수 있다. ※ 오버로딩의 조건 - 메서드 이름이 같아야 한다. - 매개변수의 개수 또는 타입이 달라야 한다. - 리턴타입은 오버로딩을 구현하는데 영향을 주지 않는다. 즉 리턴타.. 더보기
Recursion의 응용 [Counting Cells in a Blob] ※ 문제 설명 private static int BACKGROUND_PIXEL = 0; private static int IMAGE_PIXEL = 1; private static int VISITED_IMAGE_PIXCEL = 2; private static int[][] grid ={ {1,0,0,0,0,0,0,1}, {0,1,1,0,0,1,0,0}, {1,1,0,0,1,0,1,0}, {0,0,0,0,0,1,0,0}, {0,1,0,1,0,1,0,0}, {0,1,0,1,0,1,0,0}, {1,0,0,0,1,0,0,1}, {0,1,1,0,0,1,1,1} }; public static void main(String[] args) { int x=0; int y=0; int blob =0; ArrayList c.. 더보기
Recursion의 응용 [미로찾기1] ※ 재귀함수를 이용한 미로찾기 - 재귀함수를 이용하여 위의 미로의 형태에서 출구를 찾는 알고리즘을 구현 한다. - 문제에서는 findExit 메소드의 리턴값을 boolean으로 두고 출구가 있느냐 없느냐를 true, false로 나타내는데서 끝냈지만 개인적으로 탐색한 경로를 알고싶어서 아래와 같은 식으로 구현했다. public class mazeEx { private static int PATH_WAY = 0; private static int WALL = 1; private static int VISITED_WAY =2; private static int EXIT = 3; private static boolean IS_ESCAPE = false; private static int [][] MAZE = .. 더보기
순환(RECURSION)의 개념과 기본 예제3 ※ 순환 알고리즘 설계(Design Recursion) 적어도 하나의 base case, 즉 순환되지 않고 종료되는 case가 있어야 된다. 모든 case는 결국 base case로 수령되어야 함. 암시적(implicit) 매개변수를 명시적(explicit) 매개변수로 바꿔라 - 암시적 변수와 명시적 변수? **일반적인 반복문을 이용해서 배열탐색을 할때 아래와 같은 방식으로 구현을 한다. 여기서 명시적 변수는 n,data,target이 되고 암시적 변수는 i가 된다.(변수 선언이 되어있지 않다.) public static int search(int n, int [] data, int target){ for(int i=0;iend){ return -1; }else if(target==data[begin]).. 더보기
순환(RECURSION)의 개념과 기본 예제2 ※ 순환적으로 사고하기(Recursive Thinking) - Recursion은 수학함수뿐 아니라 다른 많은 문제들도 해결 가능하다.(반복문) ※ 예제 - 글자 길이구하기 public class ex { public static void main(String[] args) { int iLength = getLength("hello"); System.out.println(iLength); } public static int getLength(String str){ if(str.equals("")){ return 0; }else{ return 1+getLength(str.substring(1)); } } } - 글자 거꾸로 출력하기(CASE1) public class ex { public static vo.. 더보기
순환(RECURSION)의 개념과 기본 예제1 ※ RECURSION? - 자기 자신을 다시 호출하는 메소드(재귀함수) - 무한루프에 빠질 수 있으므로 적어도 하나의 breaking point를 만들어준다. (Base Case) - recursion을 반복하다보면 결국 base case로 수렴해야 한다(Recursive Case) ※ 예제 - Factorial(n!) public class factorial { public static void main(String[] args) { int iResult = fn_factorial(5); System.out.println(iResult); } public static int fn_factorial(int n){ if(n==1){ return 1; }else{ return n*fn_factorial(n-.. 더보기
알고리즘의 분석, 공간 복잡도, 시간복잡도 ※ 알고리즘 분석 - 알고리즘의 실행 시간 및 기타 자원의 사용량을 분석 - 기타 자원으로는 메모리, 저장장치, 통신 등이 있다. - 알고리즘 분석에는 시간 복잡도(Time Complexity)와 공간 복잡도(Space Complexity)를 이용한다. - 주로 수행시간(시간 복잡도)을 분석한다. ※ 공간 복잡도 - 알고리즘을 실행하여 종료할때까지 필요한 기억장치의 크기 - 알고리즘과 무관한 부분 : 프로그램 코드를 저장하기 위한 공간, 프로그램을 수행하기 위해 시스템이 필요로 하는 공간 - 알고리즘과 밀접한 부분 : 문제를 해결하기 위해 필요한 공간 ex)변수를 저장하기 위한 공간 예제) 공간 복잡도의 계산 public int fn_abc(int a, int b, int c){ return (a+b+c.. 더보기
[자바] 클래스 ※ 클래스란? 객체지향 프로그래밍에서 로직과 데이터를 묶어놓은 하나의 단위 혹은 객체를 정의해놓은 것으로써 객체를 생성하는데 사용된다. ※ 클래스와 객체 위에서 말했듯 클래스는 객체를 생성할 때 사용된다. 가장 흔하게 사용되는 비유가 붕어빵과 붕어빵틀로 비유한다. 클래스는 붕어빵을 만드는 틀이고 그 틀에서 만들어진 붕어빵은 객체라고 한다. 아래 직접 코드로 예를 들어보자. ex) Cat yaOngE = new Cat(); Cat navi = new Cat(); Cat nyan = new Cat(); ... Cat이라는 클래스에 고양이에 관한 데이터, 메서드 들이 정의되어 있다. 이러한 클래스를 이용하여 세개의 고양이 객체(야옹이,나비,냥)를 만들었다. 즉 Cat이라는 클래스 안에 고양이에 대한 로직 데이.. 더보기
JVM(자바가상메모리)의 메모리구조 ※ JVM(자바가상메모리)의 메모리구조 이전 글에서 JVM은 운영체제에 상관없이 자바코드와 운영체제 사이에서 운영체제 맞게 변경시켜주는 역할을 한다고 했다. 하지만 이 외에도 응용프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요 영역이 있는데 메서드영역(Method Area), 힙(heap)영역, 스택(stack)영역이 있다. 메서드영역 (Method Area) JVM은 클래스파일(*.class)을 읽어서 분석하여 데이터를 이곳에 저장. 클래스에 관한 정보가 이 영역에 저장된다. 스택 (Stack) 메서드 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 스택에 쌓이고 그 메서드가 끝나면 스택에.. 더보기