전체 글293 Java의 메모리 구조_메소드의 매개변수 [3/3] 이전 글에서 8가지 원시타입의 변수를 제외한 모든 변수는 참조 변수라고 했습니다. 이 구조를 이해하면 메소드 사용 시 실수를 피할 수 있습니다. C언어를 해보신 분들은 C언어의 함수와 포인터와 동일한 원리라고 이해하시면 됩니다. 아래 코드를 보시고 결과를 한 번 예측해보세요. package study.first; /* Public class */ public class Main { public static void main(String[] args) { String arr = "Hello"; print(arr); System.out.println(arr); } static void print(String text) { text += " world"; } } 정답은 "Hello"만 출력됩니다. C언어의 포.. ▸JAVA/기본 상식 2019. 12. 9. Java의 메모리 구조_자바가 상대적으로 느린 이유[2/3] C언어에 비해 Java가 느린 이유는 크게 2가지를 들 수 있을 것 같습니다. 첫 번째는 객체지향언어라는 특성 때문이고, 두 번째는 JVM이라는 가상 머신을 사용하기 때문입니다. 둘 다 개발자의 편의성을 위해 성능을 희생하고 있는데, 사실 하드웨어도 빨라지고 Java 자체의 소프트웨어도 워낙 발달해서 초기에 이슈가 됐던 성능 이슈가 잠잠해졌습니다. 하지만 여전히 하드웨어 스펙을 짱짱하게 넣지 못하는 소규모 장비 등에서는 C언어를 주로 사용한다고 합니다. [ 객체지향언어의 특성으로 인한 느림 ] Java에서는 클래스 단위로 모든 코드를 작성합니다. C언어와 같이 함수 단위가 아닙니다. 따라서 다른 클래스에 있는 일부 메소드나 정보를 사용하기 위해서는 전체 클래스를 인스턴스로 만들어 메모리에 저장해야 합니다.. ▸JAVA/기본 상식 2019. 12. 9. Java의 메모리 구조_기본 구조[1/3] 개발자 입장에서 프로그램이 어떻게 돌아가는지와 효율적인 메모리 관리를 어떻게 해야하는지에 대해 큰 줄기만 정리해보겠습니다. 가장 기본 언어이자 기본 구조인 C언어의 메모리 구조와 비교하면서 보시면 이해가 더 잘될 것 같습니다. 혹시 C언어의 메모리 구조 또는 스택/힙 메모리에 대해 잘 모르시는 분은 아래 두 개 글을 참고하시면 됩니다. 2019/12/05 - [C언어/기본상식] - C언어의 메모리_기본 구조 [1/2] 2019/12/05 - [C언어/기본상식] - C언어의 메모리_스택 메모리 [2/2] 먼저 소스코드를 작성하고 컴파일하면 JDK에 들어 있는 컴파일러가 바이트 코드로 번역해서 .class 파일을 만들어 줍니다. 바이트 코드는 기계가 못 읽고 Java만 알 수 있는 중간 언어입니다. 그리.. ▸JAVA/기본 상식 2019. 12. 9. 클래스, 인스턴스, 객체의 차이 혼용하거나 좁은 의미로 쓰기도 하지만 세 가지는 모두 다른 의미를 가지고 있습니다. 사실 클래스와 인스턴스는 의미가 명확한데 객체라는 것은 워낙 포괄적인 의미라 모호할 수 있으니 정확한 개념을 잡고 있어야 커뮤니케이션에 오류가 줄어들 것 같습니다. [ 클래스 ] 클래스가 어떻게 생겼는지 정해둔 양식지, 설계도 C언어의 구조체 정의와 같음 (실제로 사용하기 전 구조체 정의만 한 상태) 설문조사를 하기 위해 설문조사 항목(변수)와 절차(메소드)를 하나의 문서로 만들어서 컴퓨터에 저장해둔 상태가 클래스입니다. 즉, 아직 인쇄되진 않고 양식만 존재하는 상태입니다. [ 인스턴스 ] 클래스를 담은 일종의 클래스 변수 C언어 구조체에서 구조체 타입 변수 하나를 생성한 것과 동일 객체의 하위 개념 (같은 개념은 .. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(다형성) [4/4] 4. 다형성 하나의 클래스나 메소드가 다양한 방식으로 동작이 가능한 것을 의미 부모클래스가 자식클래스의 값으로 대체되는 오버라이딩 같은 메소드의 매개변수(parameter)에 따라 다르게 동작하는 오버로딩 다형성 또한 상속과 마찬가지로 객체지향 고유의 특징입니다. 예를 들어 C언어에서 아래와 같은 프로그램을 만들었다고 가정하겠습니다. 서로 입력값의 갯수 또는 타입이 다르기 때문에 모두 다른 함수로 만들어줘야 합니다. "인자값을 받아서 특정한 결과값을 출력한다"라는 공통적인 행위이지만, 각자 개별적이고 독립적인 함수(일종의 객체)로 실행됩니다. 우리가 한 파일에다가 함수들을 모아둘 순 있지만 기본적으로 저 함수들은 그냥 서로 연관성이 1도 없는 개별적 함수들로 존재합니다. 저런 게 10가지가 있다면.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(상속) [3/4] 3. 상속 재사용성을 극대화시키기 위한 장치 부모 클래스의 속성을 그대로 물려받음 (물론 설정에 따라 완전히 같지 않을 수 있음) 상속의 개념은 매우 쉽습니다. 자식 클래스는 부모 클래스의 속성을 물려받도록 한다는 것이죠. C언에는 상속이라는 개념이 없습니다. 그냥 기존 함수 코드를 복사해서 붙여놓고 그 아래에 더 필요한 부분을 추가해줘야 합니다. 한 두개 정도라면 별 무리가 없지만 만약 100개의 함수에 공통된 부분이 10줄 존재한다면 코드 중복이 1000줄 발생하는 문제점이 생기죠. Java에서는 상속이라는 기능을 이용해서 위 과정을 매우 직관적이고 간단하게 만들어 줬습니다. 이미 만들어둔 코드의 재활용성을 극대화시키고 거기에 코드가 간결해지는 효과도 낼 수 있습니다. 오버라이딩 같은 기능과 함께.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(캡슐화) [2/4] 2. 캡슐화 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 사용방법만을 노출시킨다. 중요 정보를 숨겨(정보 은닉) 잘못된 수정을 막고, 사용자가 쉽게 사용할 수 있도록 만들어 줌 굳이 사용자가 알 필요가 없는 부분은 접근할 수 없도록 꽁꽁 싸서 캡슐안에 넣어둔다는 의미에서 캡슐화라고 합니다. 클래스 변수(필드)가 될 수도 있고 메소드가 될 수도 있습니다. 내가 만든 클래스에서 불필요한 곳에는 직접 접근할 수 없도록 하여 리소스의 공유와 보안 사이의 균형을 맞춰주는 것입니다. 적절한 예로 해쉬 사례를 들 수 있을 것 같습니다. 제가 어떤 문자열을 주면 해쉬값으로 바꿔주는 함수를 C언어로 하나 만든다고 해보겠습니다. 함수의 기본 뼈대는 "문자열 순서에 따라 아스키코드에 특정 값을 곱해서 더.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어의 특징(추상화) [1/4] 그럼 객체지향언어가 가지고 있는 대표적인 특징을 기준으로 C언어와 Java를 비교해보겠습니다. 1. 추상화 (Abstract) 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것 Java에서는 하나의 객체를 추상화하여 클래스를 만든다고 표현함 C언어에서는 구조체가 Java의 클래스에 가장 가까운 개념입니다. 어떠한 목적에 필요한 타입이 다른 여러 변수를 하나의 구조체에 묶어서 정의해둠으로써, 필요할 때 그 구조 전체를 가져다 쓰는 것이죠. 사실 변수들을 각자 따로 만들어서 써도 무방하지만 구조체를 이용하면 보다 직관적으로 데이터 구조를 확인하고 사용할 수 있습니다. 이 개념이 확장되어 발전된 것이 객체이며 Java의 클래스라고 볼 수 있습니다. 같은 구조의 정보를 담는 변수.. ▸JAVA/기본 상식 2019. 12. 9. 객체지향 언어와 절차지향 언어와의 차이 Java를 하면서 가장 먼저 알아야 할 객체지향언어의 개념을 정리해봤습니다. 절차지향 언어의 대표주자인 C언어와, 객체지향 언어의 대표주자인 Java를 기준으로 설명했습니다. 먼저 절차지향언어와 객체지향언어는 대립점에 있는 개념이 아닙니다. 모든 컴퓨터 언어는 기본적으로 절차(순서)에 따라 실행됩니다. 기본적으로 객체지향언어도 절차대로 수행되는 컴퓨터 언어입니다. 그저 더 중요시하는 "사상"이 다를 뿐입니다. 어떤 프로그램이라도 절차지향언어로 만들 수도, 객체지향 언어로 만들 수 있습니다. 만드는 과정이 조금 다를 뿐입니다. 예를 들어 된장찌개를 끓인다고 가정해보겠습니다. 춘향이는 절차를 지향해서 아래와 같이 순서대로 요리를 합니다. 길동이는 객체를 지향해서 아래와 같이 미리 재료를 다 준비해두고 한.. ▸JAVA/기본 상식 2019. 12. 9. 워크스페이스/프로젝트/패키지/클래스의 개념 및 명명 규칙 C에서 JAVA로 넘어오니, 해당 개념이 헷갈려서 정리해봅니다. 이클립스 기준입니다. 먼저 전체적인 구조는 아래와 같습니다. 실제 우리가 코딩을 하는 부분은 모두 "클래스(Class)"입니다. 나머지는 분류를 위한 일종의 카테고리라고 볼 수 있습니다. ※ 공통 명명 규칙 - 대소문자 구분이 됨 - 예약어(시스템에서 이미 사용하고 있는 이름)를 사용하면 안됨 - 숫자로 시작할 수 없음 - 특수문자는 '_'(언더바), '$'만 사용가능 [ 워크스페이스(WorkSpace) ] 하나의 프로그램 단위 규모가 큰(기능이 많은) 프로그램은 여러 실행파일(프로젝트)로 이루어질 수 있음 가장 상위 폴더로 생성됨 ※ 워크스페이스 명명(이름) 규칙 - 공통규칙에 따름 [ 프로젝트(Project) ] 하나의 실행파일 단위.. ▸JAVA/기본 상식 2019. 12. 9. 백준알고리즘_2751_정렬 (힙정렬) (C언어) 사실 시간 복잡도 O(nlogN)의 알고리즘은 기초알고리즘 게시판에서 다 정리했지만.. 혹시 까먹었을까 싶어 한 번 풀어봤습니다. 오랜만에 짜봐서 그런지 또 시간이 꽤 걸렸네요. ㅎㅎ 시간 복잡도를 낮추려면 병합정렬, 퀵정렬, 힙정렬 세 가지 중 하나를 사용하면 됩니다. 저는 제일 좋아하는 힙정렬을 사용했습니다. 알고리즘 설명은 아래 링크글에 있습니다. 2019/12/09 - [C언어/알고리즘 및 자료구조] - 정렬알고리즘_힙 정렬 [6/8] #include #include void heap(int* arr, int n); void swap(int* arr, int x, int y); int main() { // 배열 생성, 스택에 담기엔 너무 크다고 에러나서 동적 할당 int* arr = (int*)m.. ▸알고리즘 문제 풀이 2019. 12. 9. 백준알고리즘_10870_재귀함수_피보나치수열 (C언어) 자바 공부하다가 머리가 아파서 잠시 머리도 식힐겸 알고리즘으로 돌아와서 C를.. 자바의 객체 개념은 정말 어렵네요. 외울 것도 많고.. 재귀함수 버전 피보나치 수열은 재귀함수 입문용인데 의외로 인터넷 보면 어마어마한 성능을 요구하는 재귀함수를 정답이라고 올려두신 분들이 많은 듯 합니다.. 기본적으로 피보나치 수열 공식이 "f(n) = f(n-1) + f(n-2)" 이라고 아래와 같이 그대로 재귀함수 코드를 짰다가는 컴퓨터한테 혼납니다. 컴퓨터 성능에 따라 다르겠지만 대략 제 컴퓨터에서는 35이상 넘어가면 연산 시간이 1초를 넘어가네요. #include int pivo(int num); int main() { int num; scanf("%d", &num); printf("%d", pivo(num + .. ▸알고리즘 문제 풀이 2019. 12. 9. 백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어) 처음 풀어본 알고리즘 문제인데 이틀이 꼬박 걸렸습니다. 그런데 모범답안보니 너무 간단하네요. ㅠ 하노이탑 이동 원리를 아는 것 자체는 사실 무의미하지만 이 문제를 푸는 사고 과정 자체가 확립 되는 것이 중요할 것 같습니다. 머리 좋은 사람 참 많네요. 전 모범답안 보고도 한참 헤맸는데.. 재귀함수가 모두 그렇듯, 키 포인트는 함수 자체가 계속 부분집합으로 발생했다 없어지는 방식이라는 것입니다. 일반적인 사고 방식과 같이(저처럼..) 전체를 보면서 풀어나가면 답이 없습니다. 제가 이틀 걸려 짠 코드는 가장 아랫쪽에 남겨둡니다. 흑역사네요. 간단히 3개짜리 원판 옮기기 구조만 보면 나머지는 로직만 주고 컴퓨터에게 맡길 수 있습니다. 실제로 원판이 7개쯤 되면 손으로 그리기도 힘듭니다. 세 개짜리 원판에서 가.. ▸알고리즘 문제 풀이 2019. 12. 9. 이분탐색(재귀함수 사용법)_값 찾기 [1/1] [ 이분탐색이란? ] 정렬된 데이터에서 특정 값을 찾을 때, 하나하나 찾는것이 아니라 범위를 좁혀나가며 찾는 방법 O(logN)의 시간 복잡도가 소요되어 정렬되어 있는 데이터를 보다 빠르게 검색 가능 이미 정렬이 되어 있다는 것은 처음부터 찾아나가는 것 보다 더 효율적인 탐색 방법이 항상 존재합니다. 그 중 가장 간단한 방법인 이분 탐색을 해도 해도 항상 헷갈리는 재귀함수 사용법과 함께 정리해봅니다. 먼저 정렬된 데이터가 있습니다. size를 구하고 찾을 데이터를 입력합니다. 배열에서 범위를 지정할 때는 대부분 size를 사용하는 것이 편합니다. 예를 들어 10개가 있으면 배열의 마지막 인덱스는 9이지만 총 10개라 size는 10이 됩니다. int arr[] = { 1,2,5,7,11,15,22,38,.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 이분매칭_작업 할당하기[1/1] [ 이분 매칭이란? ] 1:1 매칭 개념으로 하나의 노드에 하나만 효율적으로 할당하는 방법 기본 1:1 매칭이지만 조금 고치면 특정 노드는 2:1매칭 등으로 수정 가능 응용하기 나름 예를 들어 실생활에서 여러 개의 희망 사항을 모아서 가장 효율적으로 배분하는 방법이라고 볼 수 있습니다. 청소 구역 신청을 예로 들어보겠습니다. 아래와 같이 학생들이 각자 희망하는 청소구역을 여러개 적어서 냈을 때, 가장 효율적으로 배분하는 방법입니다. 몇 명 안되면 손으로 하면 되는데 학생수가 많으면 손으로 하기보단 코딩해서 뽑아내는게 더 빠르겠네요. 간단히 방법론에 대해 설명하자면 아래와 같은 과정을 통해 진행됩니다. 위 로직을 그대로 코드로 옮기면 됩니다. 다들 C++로 짜는지라 저 편한대로 C로 구현해봅니다. 입력 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 이전 1 ··· 14 15 16 17 18 19 20 다음 💲 추천 글 반응형