지금은 카테고리를 분야별로 대충 나눠놓았는데, 일부 프로젝트들은 아예 해당 프로젝트 전용 카테고리를 따로 만들어둘까 생각이 들어요.

게시글 5개 정도 말고는 올리지 않을 것 같은 1회성 프로젝트를 하나 생각 중인데, 이게 웹 백엔드랑 안드로이드 네이티브를 사용할 예정인지라,

기존처럼 웹과 앱으로 나누어놓으면 같은 프로젝트인데 여러 카테고리로 글이 나뉘어버여요.

일본 시코쿠에 있는 타카마츠(다카마쓰)는 우동이 유명해요. 정확히는 시코쿠 안에 카가와현이 있고, 카가와현 안에 타카마츠시가 있는데, 카가와현에서 우동이 유명해요.

작년에 잠시 타카마츠에 들렸을 때, 우동을 먹으려 다녀왔어요.

 

타카마츠칫코역에서 코토히라선 또는 나가오선을 타고 한 정거장 이동하면 카타하라마치역이 나와요.

코토히라선과 나가오선은 코토덴(타카마츠 코토히라 전기철도)이라는 철도 회사에서 운영해요.

 

카타하라마치역은 역 건물에 슈퍼마켓이 붙어있어요.

 

 

 

역에서 2분 정도 걸어가면 보이는 사누끼우동 엔야

 

 

 

지금까지 먹어본 우동 중 여기서 먹었던 우동이 가장 맛있었어요. 나중에 또 타카마츠에 갈 일이 있다면 다시 다녀올 것 같아요.

위에 토핑된 저 튀김은 닭고기. 이후에 한국에서 비슷한 메뉴들을 먹어본 적은 있는데, 타카마츠에서 먹었던 것이 더 맛있었어요.

 

 

그리고 여기 식당 사장님께서 한국어를 어느 정도 할 줄 아시는 듯.

 

 

근처 상점가인 카타하라마치.

 

 

시간이 부족했어서 밥만 먹고 떠난지라 주변을 제대로 둘러보진 못했어요.

폐역되기 전에 다녀갔던 중앙선 화본역. 역 건물이 예뻐서 유명해진 곳. 대구광역시 군위군에 위치.

 

 

더 앞에서 찍은 화본역 건물

 

 

역 앞에서 본 고양이

 

 

화본역 역사 내부

 

 

화본역 승강장

 

 

승강장에 진입한 무궁화호와 그 뒤로 보이는 급수탑

 

 

2024년 12월 20일부로 중앙선이 이설되며 폐역되었어요.

자료형

 - 값의 형태

 - 변수가 가질 수 있는 데이터의 종류

 

정수 (int, long)

 - 1, 2, 3, 2147483647 같은 정수

 - int는 - 2147483648부터 2147483647까지만 표현 가능.

 - 해당 범위를 넘어간 값은 long(긴 정수)을 사용하면 됨

 - int보다 범위가 작은 short도 있음

 

실수 (float, double)

 - 1.0, 3.14 같은 실수

 - float보다 double이 더 많은 메모리를 사용하고, 그만큼 정밀도도 높음

 

문자 (char, character의 약자)

 - 'a', 'b', '가'과 같은 글자 하나. 유니코드라서 2바이트를 차지하고, 한글도 넣을 수 있음

 - 작은 따옴표로 감싸놓음

 

문자열 (String)

 - "a", "abc", "응애"와 같은 글자들. "a"의 경우 길이가 1인 문자열로, 'a'와는 다름

 - 큰 따옴표로 감싸놓음

 

논리값 (boolean)

 - 참과 거짓만 있는 값

 - true, false

 

객체

 - 나중에. 사실 String도 객체임


변수 (variable)

 - 대충 이름에 값 저장하고 불러오기라고 생각해도 됨

- "어떠한 값을 저장할 수 있는 것" 그 자체

 - 해당 값은 컴퓨터 부품 중 RAM에 저장. 즉, 무언가를 저장하기 위해 운영체제로부터 받아온 RAM에 있는 메모리 공간
 - 이름에 수가 들어가서 값일 것 같지만, 값이 아님. 번역 개판으로 했다고 욕하는 사람들 있음

 

자바에서 변수 선언하기

//변수 선언만 하기
자료형 변수이름;
int a;
double b;
char c;

//변수에 값 넣기
변수이름 = 값;
a = 1;
b = 3.14;
c = 'a';

//변수 선언과 동시에 갆 넣기
자료형 변수이름 = 값;
int a = 1;
double b = 3.14;
char c = 'a';

 

 

코틀린에서 변수 선언하기

//변수 선언만 하기
var 변수이름: 자료형
var a: Int
var b: Double
var c: Char

//변수에 값 넣기
변수이름 = 값
a = 1
b = 3.14
c = 'a'

//변수 선언과 동시에 갆 넣기
var 변수이름: 자료형 = 값
var a: Int = 1
var b: Double = 3.14
var c: Char = 'c'

//선언과 동시에 값을 넣는 경우는 자료형을 생략해도 됨
//넣는 값을 보고 알아서 자료형 맞춰줌
var 변수이름 = 값
var a = 1
var b = 3.14
var c = 'c'

 

 

변수로 더하기 빼기 해보기

//자바
int a = 1;
int b = 2;
int c = a + b; //변수 c에는 3이 들어감. a에 저장된 값 1과 b에 저장된 값 2를 더해서 c에 넣었기 때문int a = 1;

//코틀린
var a = 1
var b = 2
var c = a + b //변수 c에는 3이 들어감. a에 저장된 값 1과 b에 저장된 값 2를 더해서 c에 넣었기 때문

 

 

그래서 변수를 어디다가 씀?

 - 실제로 프로그래밍을 해보면 아주 많이 사용할 것


상수 (constant)

 - 변하지 않는 값. 또는 그 값 그 자체

 

리터럴 상수

 - 1, 2, 3.14, "응애"와 같은 값 그 자체

 - 1은 항상 1이고, 2는 항상 2이며, 3.14는 항상 3.14고 "응애"라는 글자는 항상 응애임

 - 값 그 자체는 변하지 않기 때문에 상수

 

심볼릭 상수

 - 이름이 있는 상수

 - 변수 선언과 동시에 값을 넣을 때, 다른 값으로 바뀌지 않도록 고정하는 방식

 

자바에서 상수 선언

 - 자료형 앞에 final 붙이기

int a = 10;
a = 20;  //a에 저장된 값을 20으로 변경

final int a = 10;
a = 20;  //상수는 값을 바꿀 수 없으니, 오류 발생

 

 

코틀린에서 상수 선언

 - var 대신 val 사용하기

 - var은 variable의 약자, val은 value의 약자

 - 안드로이드 스튜디오에서 코틀린으로 앱 개발을 하는 경우, var를 사용하고 값을 바꾸지 않는다면 val로 바꾸는게 어떻냐는 제안 메시지가 나옴

var a = 10;
a = 20;  //a에 저장된 값을 20으로 변경

val a = 10;
a = 20;  //상수는 값을 바꿀 수 없으니, 오류 발생

 


변수 & 상수 선언시 암묵의 룰

변수의 이름은 주로 소문자로, 상수의 이름은 전부 대문자만 사용하는 암묵의 룰이 있음

//변수 : 전부 소믄자 사용, 여러 단어가 있으면 _로 구분하거나 첫 글자를 대문자로 선언
int speed = 50;
int current_speed = 50; //주로 C언어나 파이썬에서 쓰는 방식
int currentSpeed = 50;  //주로 자바에서 쓰는 방식

//상수 : 전부 대문자 사용, 여러 단어가 있으면 _로 구분
final int MAX_SPEED = 100;

 

 

코틀린에서, 원래 변수를 사용했어야 할 위치에 val을 적은 듯한 느낌인 경우는, 그냥 변수 선언하는 암묵의 룰을 따름


배열 (Array)

 - 이름 하나에 값 여러개를 저장하는 경우에 사용

 - 넣은 값들은 순서(index)로 구분. index는 0부터 시작

 - 언제가에는 사용할 일이 올 것

 - 한 번 선언하면 길이가 고정됨.

//int만 담을 수 있는 길이가 3인 배열 a
int[] a = { 1, 2, 3 };

 

리스트 (List)

 - 배열 비슷한 거 있음

 - 배열과는 달리, 길이가 알아서 늘어남


제어문

 - 프로그램의 실행 순서와 흐름을 제어

 - 뭐가 많지만, 사실상 if, for, while를 사용하는 경우가 99%

 

조건문 : if

 - 조건이 참이면 실행. 아니면 else 부분 실행. else가 꼭 올 필요는 없음

if (조건) {
  //조건이 참이면 실행햘 내용
} else {
  //조건이 거짓이면 실행햘 내용
}


int a = 10;

if (a == 10) {  //같은지 아닌지 구분은 "=" 2개 사용
  //a에 저장된 값이 10이라면 실행될 내용
} else {
  //a에 저장된 값이 10이 아니라면 실행될 내용
}

 

 

조건문 : switch

 - 값 하나를 여러번 비교하는 경우에 사용. 주로 메뉴 구성애 사용되며, 초심자는 일단 if만 사용해도 됨

 - 자바와 같은 대부분의 언어에는 switch문이 있고, 코틀린에는 switch문 대신 when문이 있음. 기능은 동일

 - 자바 switch 예시

예시) 메뉴 id에 따라 다른 메뉴를 열어야 하는 경우,

//if-else 사용
if (menuId == 1) {
    //1번 메뉴 열기
} else if (menuId == 2) {
    //2번 메뉴 열기
} else if (menuId == 3) {
    //3번 메뉴 열기
} else {
    //잘못된 메뉴입니다
}

//switch 사용
switch (menuId) {
    case 1: 
        //1번 메뉴 열기
        break;
    case 2: 
        //1번 메뉴 열기
        break;
    case 3: 
        //1번 메뉴 열기
        break;
    default:
        //잘못된 메뉴입니다.
}

 

 - 코틀린 when 예시. 코틀린의 장점인 간결함을 볼 수 있다.

예시) 메뉴 id에 따라 다른 메뉴를 열어야 하는 경우,

//if-else 사용
if (menuId == 1) {
    //1번 메뉴 열기
} else if (menuId == 2) {
    //2번 메뉴 열기
} else if (menuId == 3) {
    //3번 메뉴 열기
} else {
    //잘못된 메뉴입니다
}

//when 사용
when (menuId) {
    1 -> //1번 메뉴 열기
    2 -> //2번 메뉴 열기
    3 -> //3번 메뉴 열기
    else -> //잘못된 메뉴입니다
}

 

 

반복문 : while

 - 조건이 참이면 계속 실행

 - 언젠가에는 거짓이 될 조건과 함께 사용

while (조건) {
  //반복할 내용
}


//예시 : 1부터 100까지 더하기
int sum = 0;  //합이 저장될 변수
int i = 1;    //1씩 증가할 변수
while (i <= 100) {  //i가 100 이하면
    sum = sum + i;  //sum에다가 i 더하기
    i = i + 1;      //i에 있는 값 1 증가
}
//반복이 끝나면 sum에는 5050이 저장된 상태

//위와 동일하게 작동하는 소스
int sum = 0, i = 1;  //변수의 자료형이 같으면 한 번에 선언 가능
while (i <= 100) {   //i가 100 이하면
    sum += i;    //+=로 값 증가 가능
    i++;         //++로 값 1 증가 가능
}
//반복이 끝나면 sum에는 5050이 저장된 상태


//이런식으로 아예 대놓고 조건에 true를 넣어버리면 항상 참이라서 무한반복이 됨
while (true) {
    //무한반복
}

 

 

반복문 : do~white

 - 일단 실행 먼저 해보고 조건 확인. 이거 사용하는거 싫어하는 사람이 있음

 - 사용 예시) 사용자로부터 값을 입력받고, 올바르지 않은 값이 입력되었다면 다시 입력을 요청하는 프로그램

do {
    //일단 실행할 내용
} while(조건);


//예시 : 10 미만인 수만 입력받아야 하는 경우
int input;
do {
    input = (사용자로부터 값 입력);
} while(input < 10);

 

반복문 : for

 - "N회 반복"을 할 일이 아주 많아져서 생겨난 제어문

 - 예시) 배열에 있는 모든 값 확인해보기. i에 0을 넣고, 1씩 증가시키면서 계속 반복하면 됨

 - 자바 예시

for (초기화; 조건; 증감) {
    //실행할 내용
}

//예시) 10회 반복
int i;
for (i = 0; i < 10; i++) {
  //무언가
}
/*
일단 i에 0이 들어감
0은 10보다 작으니 무언가 실행
i에 저장된 값 1 증가
1은 10보다 작으니 무언가 실행
i에 저장된 값 1 증가
2은 10보다 작으니 무언가 실행
i에 저장된 값 1 증가
.
.
.
9은 10보다 작으니 무언가 실행
i에 저장된 값 1 증가
10은 10보다 작지 않으니 반복 종료
*/

//for 안에서 변수 선언해도 됨. 이 경우, 변수 i는 for 안에서만 존재
for (int i = 0; i < 10; i++) {
  //무언가
}



//예시) 1부터 100까지 더하기
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
반복이 끝나면 sum에는 5050이 저장된 상태

 

 - 코틀린 예시

for (변수 in 범위) {
    //실행할 내용
}

//예시) 10회 반복
for (i: Int in 1..10) {
  //무언가
}
/*
일단 i에 1이 들어감
1은 10 이하니까 무언가 실행
i에 저장된 값 1 증가
2은 10 이하니까 무언가 실행
i에 저장된 값 1 증가
3은 10 이하니까 무언가 실행
i에 저장된 값 1 증가
.
.
.
10은 10 이하니까 무언가 실행
i에 저장된 값 1 증가
11은 10 이하가 아니니 반복 종료
*/


//예시) 1부터 100까지 더하기
var sum = 0;
for (i: Int in 1..100) {
    sum += i;
}
//반복이 끝나면 sum에는 5050이 저장된 상태

//위와 동일하게 작동하는 소스
var sum = 0;
for (i: Int in 1 until 100) {
    sum += i;
}

 

break, continue

 - break : 실행 중인 반복문을 멈춤

 - continue : 현재 반복 회차를 중단하고 다음 회차로 넘어감


연산자

 - ,과 new 등도 연산자이지만, 귀찮으니 생략

= 오른쪽에 있는 값을 왼쪽에 넣음
+ 더하기, 문자열이라면 붙이기
- 빼기
* 곱하기
/ 나누기
% 나머지 구하기
++ 1 증가
-- 1 감소
+= 왼쪽에 있는 값을 오른쪽에 있는 값만큼 증가시킴. 문자열이라면 뒤에 붙이기
-= 왼쪽에 있는 값을 오른쪽에 있는 값만큼 감소시킴
*= 왼쪽에 있는 값에 오른쪽에 있는 값을 곱한 값을 왼쪽에 넣음
/= 왼쪽에 있는 값을 오른쪽에 있으로 나눈 값을 왼쪽에 넣음
== 양쪽에 있는 것이 서로 같으면 참, 다르면 거짓
!= 양쪽에 있는 것이 서로 다르면 참, 같으면 거짓
! 부정
< 좌변이 우변 미만
> 좌변이 우변 초과
<= 좌변이 우변 이하
>= 좌변이 우변 이상
&& 그리고
|| 또는

 

이 게시글에서 다루지 않으나, 해야 하는 것들

JDK 설치 및 환경 변수 설정

 - 자바로 프로그래밍을 할 때 필요한 것들을 모아놓은 것

 - https://www.oracle.com/kr/java/technologies/downloads/

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

 

안드로이드 스튜디오 설치

 - 앱 개발할 때 필요한 것들 다 때려박은 프로그램

 - https://developer.android.com/studio?hl=ko

 

Android 스튜디오 및 앱 도구 다운로드 - Android 개발자  |  Android Studio  |  Android Developers

Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today.

developer.android.com

 

 

안드로이드 SDK 다운로드

 - 안드로이드 스튜디오 최초 실행시 다운로드 가능 또는 SDK Manager 실행해서 받으면 됨

 

 - 대충 저렇게 생겼고, 전 에뮬레이터는 사용하지 않을 예정이라, 안드로이드 가상머신은 뺐어요


앱 프로젝트 생성

안드로이드 스튜디오 실행 후 New Project 클릭

 

Phone and Tablet 선택 후 No Activity 선택.

여기서 Activity를 고르면 "거의 모든 개발자들이 사용하지만 없어도 되는 것"을 지멋대로 추가해서 만들어줘요.

 

 

앱 이름과 패키지명 알아서 입력. 개발 언어는 자바와 코틀린 중 하나를 선택하시면 돼요.

 

패키지명은 본인의 가진 홈페이지의 주소를 반대로 적고, 그 뒤에 앱 이름을 적는 것이 국룰인데, 홈페이지가 없어도 그냥 적어도 상관없긴 해요

아무튼 "com.본인닉네임.앱이름" 정도로 적으면 돼요. 카톡을 예로 들면, "com.kakao.talk"

언어 선택은 고민되신다면, 일단 자바로 선택해두세요. 어차피 코틀린으로 바꾸거나 섞어서 쓸 수 있어요.

 

 

저기서 Finish를 누르면 프로젝트가 생성되고, 오른쪽 아래를 보면 무언가가 실행 중일텐데,

 

저게 끝나면 왼쪽 위에 있던 Project가

 

Android로 바뀔거예요

 

앱 화면 추가

안드로이드 앱 구성 요소 중 Actiity라는 친구는 화면을 의미해요. 일단 무언가를 보여줄 화면이 필요하니 Actiity를 추가할거예요.

왼쪽 파일 탐색기? 부분에 있는 패키지명들 중 가장 위에 있는 부분에 마우스 오른쪽 클릭해서, New → Actiity → Gallery

 

여기서 "Empty Views  Actiity" 선택.

원래는 "Empty Actiity"를 누르면 빈 Actiity를 만들어줬는데, 이젠 이것저것 없어도 되는 것들을 막 가져다가 붙인 Actiity를 만들어주는 방식으로 바뀌었어요. 기존에 있던 빈 Actiity를 원한다면 "Empty Actiity" 대신 "Empty Views Actiity"를 골라야 해요.

 

사실 Gallery 안들어가고 바로 Empty Views Actiity 골랐어도 상관없어요.

 

아무튼 이게 다음 화면인데

 

Generate a Layout File은 체크 해제, Launcher Activity는 체크한 뒤에, 해당 화면을 구현할 때 사용할 언어를 선택하고 Finish 클릭

Generate a Layout File : .xml 파일로 화면을 만들고, 자바나 코틀린을 사용해서 기능을 만드는 것이 옛 국룰인데, 앱 화면도 자바/코틀린만 사용해서 만들 수 있어요. 해당 .xml 파일을 만들지 결정하는 항목

Launcher Activity : 앱 아이콘을 눌러서 앱을 실행할 때, Launcher Activity로 설정된 화면으로 실행되어요.

 

아무튼 MainActivity.java 파일이 생겼어요. 앱 메인화면의 이름을 MainActivity로 하는 것은 암묵의 룰이에요.

 

.html 파일들을 넣을 폴더 만들기

Assets Folder를 만들어주세요

 

Finish

 

Assets 폴더를 열어서

 

 

폴더 안에 .html 파일을 넣으면 돼요. 안드로이드 스튜디오 내부에서 바로 파일 편집도 가능

 


앱 내부에 넣어둔 .html 파일 불러오기 (Java를 선택한 경우)

MainActivity.java로 넘어와서, 일단 흐리게 처리된 import 어쩌고 부분은 없어도 되니까 지웠고

 

이런식으로 적어주세요.

자바스크립트 활성화 부분이 노란색으로 칠해진 이유는, WebView 내부에 악성 사이트를 불러온다면 이상한 내용을 실행할 수도 있다면서 보안 경고를 띄우고 있기 때문이에요.

그렇다고 자바스크립트를 비활성화시키면, 그냥 웹뷰 안에 불러온 모든 사이트 자체가 작동하지 않을 수 있으니 허용 필요.

 

 각 부분이 무엇을 의미하는지는 주석 참고

package 본인.앱의.패키지명;

import android.os.Bundle;
import android.webkit.WebView;

import androidx.appcompat.app.AppCompatActivity;

//대충 앱 화면이라는 뜻
public class MainActivity extends AppCompatActivity {

    //앱 화면이 켜지는 순간 실행될 내용
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //WebView 인스턴스 생성. WebView는 웹사이트나 .html 파일을 불러와서 보여줄 때 사용
        WebView web = new WebView(this);
        
        //assets 폴더에 넣어둔 index.html 파일을 WebView에 불러옴
        web.loadUrl("file:///android_asset/index.html");
        
        //해당 WebView의 자바스크립트 활성화
        web.getSettings().setJavaScriptEnabled(true);
        
        //WebView를 화면의 내용물로 설정
        setContentView(web);
    }
}

 

앱 내부에 넣어둔 .html 파일 불러오기 (Kotlin을 선택한 경우)

MainActivity.java로 넘어와서, 일단 흐리게 처리된 import 어쩌고 부분은 없어도 되니까 지웠고,

 

이런식으로 적어주세요.

자바스크립트 활성화 부분이 노란색으로 칠해진 이유는, WebView 내부에 악성 사이트를 불러온다면 이상한 내용을 실행할 수도 있다면서 보안 경고를 띄우고 있기 때문이에요.

그렇다고 자바스크립트를 비활성화시키면, 그냥 웹뷰 안에 불러온 모든 사이트 자체가 작동하지 않을 수 있으니 허용 필요.

 

 각 부분이 무엇을 의미하는지는 주석 참고

package 본인.앱의.패키지명

import android.os.Bundle
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity

//대충 앱 화면이라는 뜻
class MainActivity : AppCompatActivity() {

    //앱 화면이 켜지는 순간 실행될 내용
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        //WebView 인스턴스 생성. WebView는 웹사이트나 .html 파일을 불러와서 보여줄 때 사용
        val web = WebView(this)
        
        //assets 폴더에 넣어둔 index.html 파일을 WebView에 불러옴
        web.loadUrl("file:///android_asset/index.html")
        
        //해당 WebView의 자바스크립트 활성화
        web.getSettings().setJavaScriptEnabled(true)
        
        //WebView를 화면의 내용물로 설정
        setContentView(web)
    }
}

.apk 파일로 만들기

화면 인쪽 위에 있는 이 버튼을 누르면 나오는 메뉴에서

 

Build → Generate App Bundles or APKs → Generate APKs 선택

그냥 "Alt + B" 단축기 사용시 Build 메뉴까지는 열릴거예요.

 

그러면 또 오른쪽 아래에 무언가가 실행중이라고 뜨다가, .apk 파일 생성이 끝나면 아래와 같은 창이 나오고, 저기서 locate를 누르면

 

.apk 파일이 들어있는 폴더가 열릴거예요. app-debug.apk 파일이 완성품이니, 폰으로 옮겨서 설치 및 실행하면 돼요

 


 

일단이 글에서 다룬 것을 설치 및 실행한 모습

 

Q. App Bundle은 또 뭔가요?

A. Google Play 스토어에 앱 올릴 때 사용하는 거예요. Play 스토어에 App Bundle로 올린 앱을 설치하는 경우, 해당 기기에 맞춰서 없어도 되는 것들은 전부 제외시킨 필요한 요소들만 있는 .apk 파일이 생성되어 사용자의 기기에 설치되어요.

 

Q. 위에서 만든 .apk 파일을 Play 스토어에 올릴 수 있나요?

A. 아니요. 아직 못올려요. 여기서는 debug로 만든거고, release로 만들어서 서명해야 출시 가능


엡 화면이 이상해요

.html로 만든 부분이 앱 상단에 있는 앱 이름이 적힌 부분 아래로 들어갈 수도 있어요.

안드로이드 15부터 모든 앱을 무조건 전체화면으로 만드는 기능이 추가된 것이 원인이에요.

 - 정확히는 "안드로이드 15 이상을 타게팅하는 앱"을 "안드로이드 15 이상"에서 사용하는 경우

 - 그러면, 일단 14 이하를 타게탕하도록 바꾸면 해결

 

그럴 때는 build.gradle (Module :app) 파일을 열어서 targetSDK를 35보다 낮은 수치로 바꾼 뒤, Sync Now를 눌러서 변동사항을 적용하고나서, .apk 파일을 다시 만들어서 설치하면 해결될거에요.

targetSDK 35가 안드로이드 15고,  targetSDK 34는 안드로이드 14에요.

 

 

게시글 작성 시점 기준으로, 안드로이드 15 이상을 타게팅하는 앱은 Google Play 스토어에 올릴 수 없으니, 임시 방편 정도로만 사용하세요.

각 개별 글 화면 구현 완료. 화면 오른쪽의 텅 빈 것은 의도된 사항

 

공식 문서 설명이 영 좋지 않아서, 치환자 관련 내용을 직접 찾아보고 실험해본 결과, 다음과 같은 구조로 되어있네요.

<s_article_rep>

    <s_index_article_rep>
        블로그 메인 페이지에 접속하면 보일 내용 (홈)
    </s_index_article_rep>

    <s_permalink_article_rep>
        글 제목과 내용을 읽을 수 있은 개별 게시글 페이지 (글)
    </s_permalink_article_rep>

</s_article_rep>

 

 

댓글이나 카테고리별 글 목록, 메인 화면에 있어야 할 다음 버튼 등은 나중에 구현할 예정

 

소스코드는 깃허브에 있어요. skin.html 파일 참고

https://github.com/sinz32/SinZ_Black-tistory-skin

 

GitHub - sinz32/SinZ_Black-tistory-skin: 내 티스토리 블로그에서 사용할 예정인 스킨

내 티스토리 블로그에서 사용할 예정인 스킨. Contribute to sinz32/SinZ_Black-tistory-skin development by creating an account on GitHub.

github.com

 

'블로그 스킨 삽질 일지' 카테고리의 다른 글

#1 일단 메인 페이지만 제작  (1) 2025.09.15

index.xml 파일이 스킨 설정이 담긴 파일이니 한 번 수정해봤어요.

 

공식 문서에는 글 보관함 관련 설정인 showListOnArchive 관련 설명이 없네요.

그리고 오타도 있는데, 이거 풀리퀘 넣으면 받아주나. 깃허브 페이지 쓰던데

 

갯수 → X, 개수 → O

 

 

이거 시간 날 때마다 화면 하나하나 만들어서 적용하려고 했는데, 파일 하나에 다 때려박아놓는 구조라서 그런지, 메인화면 사이드바 부분만 조금 만졌는데 모든 화면이 다 사라졌어요.

 

아무튼, 일단 블로그 메인 페이지 접속하면 보이는 화면만 일단 완성해둔 상태

 

 

이제 다시 기존에 쓰던 스킨으로 돌려놓아야겠어요.

'블로그 스킨 삽질 일지' 카테고리의 다른 글

#2 글 본문 부분 제작  (3) 2025.09.15

흑백 무채색으로 만들지, 신비로 도배를 해놓을지 고민 중

 

아니면 여자친구, 비비지 공식색 위주로 사용해볼까


 

사실 이 글을 올린 직후에 스킨을 바로 만들기 시작했는데, 파일 하나에 다 때려박는 구조인 것 같네요.

여기서 홈 화면을 선택한 뒤에 내용을 전부 지웠더니, 모든 화면들이 다 사라졌어요.

 

시간 날 때마다 화면 하나하나 만들어서 적용하려고 했는데, 한 번에 다 완성해서 적용해야 할 듯

 

'게시판' 카테고리의 다른 글

프로젝트 백지화 : 산리쿠 철도  (2) 2025.09.21
카테고리를  (2) 2025.09.20
고민 중  (1) 2025.09.05
이번 주는 커밋 쉬는 주  (4) 2025.08.25
블로그 개설!  (3) 2025.07.30

일단 웹으로 만들었는데, 검색기라기 보다는 그냥 수록곡 목록에 가까워요.

모든 곡 목록 다 적은 뒤에, 노래방번호 적는 방식으로 만들었어요.

 

한국 앨범에 수록된 노래도 넣고, 일본 앨범에 수록된 일본어 버전 노래도 넣고,

 

 

예린 솔로곡도 넣고, 유주 솔로곡도 넣고

 

비비지 노래도 넣고. 그리고 환상 등도 일단 추가

 

신비송 같은 것들도 아래에 다 추가할까 고민 중

'웹 개발' 카테고리의 다른 글

이상한 생각?  (0) 2025.10.05
React 찍먹은 해봐야하는데  (0) 2025.10.02
웹호스팅 & 가상 서버 가격 비교 (AWS, Vultr 등 VPS)  (2) 2025.08.12

예전에 자바로 만들었던 앱을 코틀린을 사용해서 다시 만들어보았어요.

여러가지 이유로, Play 스토어에 올릴 계획은 없어요.

 

스마트폰 자체에 있는 NFC 기능을 통해 교통카드에 저장된 잔액 정보를 읽어오는 방식이에요.

 

앱을 실행하면 이런 화면이 나오고, 스마트폰 자체에 있는 NFC 기능을 활성화한 뒤에, NFC 모듈 부분에 카드를 접촉시키면 

 

이런식으로 잔액 확인이 가능해요. 이건 티머니 교통카드를 읽은 모습

 

 

캐시비 교동카드와 레일플러스 교통카드도 잘 읽혀요. 최근에 캐시비는 "이즐"로 이름을 바꿨어요.

 

테스트 용도로 사용한 한국 교통카드들. 전부 한정판이에요.

 

 

이건 일본 교통카드인 스이카(Suica)와 이코카(ICOCA)를 읽은 모습.

구분할 수 있는 방법이 분명 있긴 한 것 같은데, 아무도 몰라요. Suica 또는 Suica와 상호호환되는 교통카드들은 전부 구분이 안돼요.

 

발행 및 운영 회사 카드 이름 관할 지역
JR 홋카이도 키타카 홋카이도(북해도) 섬 전체
JR 동일본 스이카 도쿄 등 수도권을 포함한 혼슈 북동쪽 지방. 수도권부터 홋카이도 바로 아래까지.
JR 도카이 (중앙) 토이카 JR 동일본 관할 지역과 JR 서일본 관할 지역 사이. 나고야, 시즈오카 등
JR 서일본 이코카 오사카 등 간사이권을 포함한 혼슈 서쪽 지방. 간사이 지방부터 큐슈 바로 옆까지.
JR 큐슈 스고가 큐슈 섬 전체
JR 시코쿠 없음 시코쿠 섬 전체. 이코카를 사용하지만, 시코쿠 버전 이코카도 존재

 

 

카드가 많지만, 서로 다 호환되기 때문에 아무거나 써도 상관없어요. 관할구역 경계만 넘어가지 않으면 돼요.

 

아래 사진에서 왼쪽 위에 있는 것이 스이카, 오른쪽 위에 있는 것이 이코카.

스이카 아래에 있는 파스모(PASMO)라는 카드는 도쿄를 함한 수도권 지역에 있는 사철들이 연합해서 발행하는 교통카드

파스모도 Suica와 호환돼요. 마나카, 니모카, 하야카켄, 피타파(후불교통)도 호환 가능

 

 

오른쪽 아래에 있는 이루카(IruCa)는 구분이 가능해서 따로 넣었어요.

시코쿠 지방에 있는 사철인 "타카마츠 코토히라 전기철도(코토덴)"에서 발행하는 교통카드로, 코토덴에서만 사용할 수 있어요.

타카마츠 공항 → 타카마츠 역 공항버스 탑승도 가능

 

근데, 코토덴 노선에서는 이루카 대신 이코카 등 사용도 가능해서, 이미 상호호환카드가 있다면 굳이 뽑을 필요는 없어요


앱 다운로드

완성된 앱과 소스코드는 제 깃허브에서 받을 수 있어요.

https://github.com/sinz32/TransitCardBalance

 

GitHub - sinz32/TransitCardBalance: 한국&일본 교통카드 잔액조회 (티머니, 이즐(캐시비), 레일플러스, Suic

한국&일본 교통카드 잔액조회 (티머니, 이즐(캐시비), 레일플러스, Suica 계열, Iruca) - sinz32/TransitCardBalance

github.com

 

 

누구처럼 멋대로 Play 스토어에 올리지 말아주세요.

어차피 해당 .apk 파일이 Play 스토어 정책을 위반하도록 만들어놓아서 안올라갈거예요.

어겨도 아무런 문제가 되지 않지만, 보안 핑계로 강제하는 정책을 위반하도록 만들었어요.


언젠가는 해야할 것

10년 전에 발매된 티머니 교통카드가 읽히지 않는 현상이 발견되었어요.

언젠가 한 번 오래된 교통카드를 구해와서 열심히 삽질해봐야겠어요.

'Android 앱 개발 > 앱 완성' 카테고리의 다른 글

트릭컬 랩핑열차 추적기 완성  (2) 2025.10.23

+ Recent posts